对于一个已有的docker容器,怎么添加运行参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于一个已有的docker容器,怎么添加运行参数相关的知识,希望对你有一定的参考价值。

  从util-linux版本2.23开始,nsenter工具就包含在其中。它用来访问另一个进程的名字空间。nsenter要正常工作需要有root权限。很不幸,Ubuntu 14.4仍然使用的是util-linux版本2.20。安装最新版本的util-linux(2.24)版,请按照以下步骤:   为了连接到容器,你还需要找到容器的第一个进程的PID。   docker inspect --format " .State.Pid " <container-id>   通过这个PID,你就可以连接到这个容器:   nsenter --target $PID --mount --uts --ipc --net --pid   nsinit   从0.9版本开始,Docker自身就具有一个管理容器的库,名字为 libcontainer。libcontainer中的nsinit工具允许用户直接访问linux名字空间和cgroup内核。在安装nsinit之前,你首先需要安装Go运行时环境:   apt-get install git golang-go mkdir -p $HOME/go-dev/binmkdir -p $HOME/go-dev/src echo "export GOPATH=\$HOME/go-dev" >> ~/.profileecho "PATH=\$PATH:\$GOPATH/bin" >> ~/.profile source ~/.profile   接下来才安装nsinit:   mkdir -p $GOPATH/src/github.com/dotcloudcd $GOPATH/src/github.com/dotcloud git clone https://github.com/dotcloud/docker.gitcd $GOPATH/src/github.com/dotcloud/docker /usr/bin/go get -v github.com/dotcloud/docker/vendor/src/github.com/docker/libcontainer/nsinit   nsinit读取的是位于/var/lib/docer/execdriver/native/<container-id>容器目录下的配置数据。要运行nsinit,你需要切换到容器目录下。由于/var/lib/docker目录对于root用户是只读权限,因此你还需要root权限。通过docker的ps命令,你可以确定容器ID。一旦你进入/var/lib/docker目录,你就可以连接容器了:   nsinit exec /bin/bash         lxc(-attach)   直到Docker 0.8.1版本为止,LXC一直是管理容器的基本工具,Docker一直支持这个工具。但是从0.9.0版本开始,Docker默认使用libcontainer管理容器,不再依赖LXC了。因此默认情况下,你不能使用lxc-attach了。   如果你仍然希望使用lxc-attach,那么你需要使用-e lxc选项来重新启动Docker服务进程。使用这个选项,Docker的内部将再次使用LXC管理容器了。完成这个任务最简单的做法就是创建/etc/default/docker文件(如果这个文件仍然不存在),并添加以下内容:   DOCKER_OPTS=" -e lxc"   现在你可以重新启动Docker服务了。要连接容器,你需要知道完整的容器ID:   docker ps --no-trunc   接下来,你就可以连接这个容器了。要完成下面工作,你还需要root权限:   lxc-attach -n <container-id> -- /bin/bash            sshd   上面所有三种方法都要求具有主机系统的root权限。为了不采用root权限,通过ssh访问容器将是一个很好的选择。   要做到这一点,你需要构建一个支持SSH服务的基础映像。此时,我们可能遇到这样的问题:我们是不是用Docker CMD或者ENTRYPOINT运行一条命令就可以了?如果此时有sshd进程运行,那么我们就不要再运行其他进程了。接下来的工作是创建一个脚本或者使用像supervisord这样的进程管理工具来启动其它所有需要启动的进程。有关如何使用supervisord的 优秀的文档可以在Docker的web站点上找到。一旦你启动了具有sshd进程的容器,你就可以像以往一样通过ssh客户端了连接这个容器了。    参考技术A 可以使用docker container update<容器id> 命令来添加参数。

Docker基于已有的镜像制新的镜像

1.根据运行的容器制作镜像

#查看所有的容器docker ps
#暂停当前容器docker pause COTNAINER-ID
#将容器运行当前状态提交docker commit COTNAINER-ID
#根据COMMIT-ID打包容器Tag
docker tag COMMIT-ID

经过以上几个步骤,根据当前运行的容器制作镜像就完成了。

2.上传镜像到Docker Hub

如果未登录Docker Hub,需要登录Docker Hub

docker login#输入用户名和密码

推送镜像到Docker Hub

docker push IMAGE-NAME

运行结果如下图所示:
技术分享

在Docker Hub上可以查看到我们刚刚上传的镜像文件,因为这个镜像是公开的,所以现在所有人都能够docker pull获取该镜像。

技术分享

3.获取上传的镜像并运行

因为我使用的是同一台Ubuntu机器,我本地已经有了bage88/firstimage这个镜像,我先要删除该镜像,然后再获取。

3.1 删除镜像

#### 删除镜像docker rmi IMAGE_NAME

提示如下错误,有基于该镜像的容器在运行,所以我先要删除这个容器,再删除镜像。

Error response from daemon: conflict: unable to remove repository reference "bage88/firstimage"(must force) - container 25dca6040e7e is using its referenced image 31758d7d9e60

3.2 删除容器

docker rm 25dca6040e7e(这个是容器ID)

再执行一次删除镜像命令:

docker rmi bage88/firstimage###结果如下,说明删除镜像成功Untagged: bage88/firstimage:latestUntagged: bage88/[email protected]:dc8a6511903cdcd25cf2d9de76a1c9ba21c050bb7702525fb3e1ba0168071481Deleted: sha256:31758d7d9e60b3c77bad4f477faae5e9dc87d3d5d16a085263f2f6de58a381adDeleted: sha256:77757027951c22c480289ef98c6109c6d7df4e0bae9bda5db1e43436159de9e5

3.3 获取镜像

docker pull bage88/firstimage

3.4 运行镜像

docker run -d -p 8010:80 bage88/firstimage

查看结果:

技术分享


以上是关于对于一个已有的docker容器,怎么添加运行参数的主要内容,如果未能解决你的问题,请参考以下文章

docker如何启动并连入一个已有的容器

Docker基于已有的镜像制新的镜像

docker 容器修改端口

Docker容器生产实践1——永远设置容器内存限制

守护态运行Docker容器

docker给已存在的容器添加或修改端口映射