容器可以通过<code>run</code>新建一个来运行,也可以重新<code>start</code>已经停止的container,但<code>start</code>不能够再指定容器启动时运行的指令,因为docker只能有一个前台进程。
容器stop(或<code>Ctrl+D</code>)时,会在保存当前容器的状态之后退出,下次start时保有上次关闭时更改。而且每次进入<code>attach</code>进去的界面是一样的,与第一次run启动或commit提交的时刻相同。
<code>CONTAINER_ID=$(docker start <containner_id>)</code>
<code>docker stop $CONTAINER_ID</code>
<code>docker restart $CONTAINER_ID</code>
要<code>attach</code>上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕(与<code>screen</code>命令的attach类似)。
官方文档中说<code>attach</code>后可以通过<code>CTRL-C</code>来detach,但实际上经过我的测试,如果container当前在运行bash,<code>CTRL-C</code>自然是当前行的输入,没有退出;如果container当前正在前台运行进程,如输出nginx的access.log日志,<code>CTRL-C</code>不仅会导致退出容器,而且还stop了。这不是我们想要的,detach的意思按理应该是脱离容器终端,但容器依然运行。好在<code>attach</code>是可以带上<code>--sig-proxy=false</code>来确保<code>CTRL-D</code>或<code>CTRL-C</code>不会关闭容器。
<code># docker attach --sig-proxy=false $CONTAINER_ID</code>
<code>inspect</code>的对象可以是image、运行中的container和停止的container。
<code>查看容器的内部IP</code>
<code># docker inspect --format='{\{.NetworkSettings.IPAddress}}' $CONTAINER_ID</code>
<code>172.17.42.35</code>
<code>(注:由于代码块解析的问题,上面NetworkSettings前面的 \ 去掉)</code>
你可能在使用过程中会<code>build</code>或<code>commit</code>许多镜像,无用的镜像需要删除。但删除这些镜像是有一些条件的:
同一个<code>IMAGE ID</code>可能会有多个<code>TAG</code>(可能还在不同的仓库),首先你要根据这些 image names 来删除标签,当删除最后一个tag的时候就会自动删除镜像;
承上,如果要删除的多个<code>IMAGE NAME</code>在同一个<code>REPOSITORY</code>,可以通过<code>docker rmi <image_id></code>来同时删除剩下的<code>TAG</code>;若在不同Repo则还是需要手动逐个删除<code>TAG</code>;
还存在由这个镜像启动的container时(即便已经停止),也无法删除镜像;
TO-DO
如何查看镜像与容器的依存关系
删除容器
<code>docker rm <container_id/contaner_name></code>
<code>删除所有停止的容器</code>
<code>docker </code><code>rm</code> <code>$(docker </code><code>ps</code> <code>-a -q)</code>
删除镜像
<code>docker rmi <image_id/image_name ...></code>
下面是一个完整的示例:
<code># docker images <==</code>
<code>ubuntu 13.10 195eb90b5349 4 months ago 184.6 MB</code>
<code>ubuntu saucy 195eb90b5349 4 months ago 184.6 MB</code>
<code>seanlook</code><code>/ubuntu</code> <code>rm_test 195eb90b5349 4 months ago 184.6 MB</code>
<code>使用195eb90b5349启动、停止一个容器后,删除这个镜像</code>
<code># docker rmi 195eb90b5349</code>
<code>Error response from daemon: Conflict, cannot delete image 195eb90b5349 because it is </code>
<code>tagged </code><code>in</code> <code>multiple repositories, use -f to force</code>
<code>2014</code><code>/11/04</code> <code>14:19:00 Error: failed to remove one or </code><code>more</code> <code>images</code>
<code>删除seanlook仓库中的tag <==</code>
<code># docker rmi seanlook/ubuntu:rm_test</code>
<code>Untagged: seanlook</code><code>/ubuntu</code><code>:rm_test</code>
<code>现在删除镜像,还会由于container的存在不能rmi</code>
<code>Error response from daemon: Conflict, cannot delete 195eb90b5349 because the </code>
<code> </code><code>container eef3648a6e77 is using it, use -f to force</code>
<code>2014</code><code>/11/04</code> <code>14:24:15 Error: failed to remove one or </code><code>more</code> <code>images</code>
<code>先删除由这个镜像启动的容器 <==</code>
<code># docker rm eef3648a6e77</code>
<code>删除镜像 <==</code>
<code>Deleted: 195eb90b534950d334188c3627f860fbdf898e224d8a0a11ec54ff453175e081</code>
<code>Deleted: 209ea56fda6dc2fb013e4d1e40cb678b2af91d1b54a71529f7df0bd867adc961</code>
<code>Deleted: 0f4aac48388f5d65a725ccf8e7caada42f136026c566528a5ee9b02467dac90a</code>
<code>Deleted: fae16849ebe23b48f2bedcc08aaabd45408c62b531ffd8d3088592043d5e7364</code>
<code>Deleted: f127542f0b6191e99bb015b672f5cf48fa79d974784ac8090b11aeac184eaaff</code>
注意,上面的删除过程我所举的例子比较特殊——镜像被tag在多个仓库,也有启动过的容器。按照<code><==</code>指示的顺序进行即可。
<code>build</code>命令可以从<code>Dockerfile</code>和上下文来创建镜像:
<code>docker build [OPTIONS] PATH | URL | -</code>
上面的<code>PATH</code>或<code>URL</code>中的文件被称作上下文,build image的过程会先把这些文件传送到docker的服务端来进行的。
请看下面的例子:
<code># cat Dockerfile </code>
<code>FROM seanlook</code><code>/nginx</code><code>:bash_vim</code>
<code>EXPOSE 80</code>
<code>ENTRYPOINT </code><code>/usr/sbin/nginx</code> <code>-c </code><code>/etc/nginx/nginx</code><code>.conf && </code><code>/bin/bash</code>
<code># docker build -t seanlook/nginx:bash_vim_Df .</code>
<code>Sending build context to Docker daemon 73.45 MB</code>
<code>Sending build context to Docker daemon </code>
<code>Step 0 : FROM seanlook</code><code>/nginx</code><code>:bash_vim</code>
<code> </code><code>---> aa8516fa0bb7</code>
<code>Step 1 : EXPOSE 80</code>
<code> </code><code>---> Using cache</code>
<code> </code><code>---> fece07e2b515</code>
<code>Step 2 : ENTRYPOINT </code><code>/usr/sbin/nginx</code> <code>-c </code><code>/etc/nginx/nginx</code><code>.conf && </code><code>/bin/bash</code>
<code> </code><code>---> Running </code><code>in</code> <code>e08963fd5afb</code>
<code> </code><code>---> d9bbd13f5066</code>
<code>Removing intermediate container e08963fd5afb</code>
<code>Successfully built d9bbd13f5066</code>
上面的<code>PATH</code>为<code>.</code>,所以在当前目录下的所有文件(不包括<code>.dockerignore</code>中的)将会被<code>tar</code>打包并传送到<code>docker daemon</code>(一般在本机),从输出我们可以到<code>Sending build context...</code>,最后有个<code>Removing intermediate container</code>的过程,可以通过<code>--rm=false</code>来保留容器。
<code>docker build github.com/creack/docker-firefox</code>失败。
tag的作用主要有两点:一是为镜像起一个容易理解的名字,二是可以通过<code>docker tag</code>来重新指定镜像的仓库,这样在<code>push</code>时自动提交到仓库。
<code>将同一IMAGE_ID的所有tag,合并为一个新的</code>
<code># docker tag 195eb90b5349 seanlook/ubuntu:rm_test</code>
<code>新建一个tag,保留旧的那条记录</code>
<code># docker tag Registry/Repos:Tag New_Registry/New_Repos:New_Tag</code>
<code>docker ps</code>命令可以查看容器的<code>CONTAINER ID</code>、<code>NAME</code>、<code>IMAGE NAME</code>、端口开启及绑定、容器启动后执行的<code>COMMNAD</code>。经常通过<code>ps</code>来找到<code>CONTAINER_ID</code>。
<code>docker ps</code> 默认显示当前正在运行中的container
<code>docker ps -a</code> 查看包括已经停止的所有容器
<code>docker ps -l</code> 显示最新启动的一个容器(包括已停止的)
容器运行时不一定有<code>/bin/bash</code>终端来交互执行top命令,查看container中正在运行的进程,况且还不一定有<code>top</code>命令,这是<code>docker top <container_id/container_name></code>就很有用了。实际上在host上使用<code>ps -ef|grep docker</code>也可以看到一组类似的进程信息,把container里的进程看成是host上启动docker的子进程就对了。
将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。
<code>docker </code><code>cp</code> <code>/www/runoob</code> <code>96f7f14e99ab:</code><code>/www/</code>
将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。
<code>docker </code><code>cp</code> <code>/www/runoob</code> <code>96f7f14e99ab:</code><code>/www</code>
将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。
<code>docker </code><code>cp</code> <code>96f7f14e99ab:</code><code>/www</code> <code>/tmp/</code>
10、docker 容器保持后台运行的两种方式
10.1 run一个容器: (推荐方法)
<code>[root@localhost ~]</code><code># docker run -dit --hostname centos --name centos --restart always a8493f5f50ff /bin/bash</code>
<code> </code>
<code>-dit 是后台运行、交互模式、分配终端,容器启动后不会退出</code>
<code> </code><code>如果没有it参数,run 一个容器以后,docker </code><code>ps</code> <code>-a 容器状态就exited了</code>
<code>--restart always 容器可以随docker服务启动而启动</code>
10.2 run 一个容器,并一直发送ping包
<code>[root@localhost ~]</code><code># docker run -d --name test --hostname test a8493f5f50ff ping 127.0.0.1</code>
开启ping进程,则主机一直运行
本文转自 jackjiaxiong 51CTO博客,原文链接:http://blog.51cto.com/xiangcun168/1958278