天天看点

docker学习笔记(五)——Docker常用命令总结

容器可以通过<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 &lt;containner_id&gt;)</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 &lt;image_id&gt;</code>来同时删除剩下的<code>TAG</code>;若在不同Repo则还是需要手动逐个删除<code>TAG</code>;

还存在由这个镜像启动的container时(即便已经停止),也无法删除镜像;

TO-DO

如何查看镜像与容器的依存关系

删除容器 

<code>docker rm &lt;container_id/contaner_name&gt;</code>

<code>删除所有停止的容器</code>

<code>docker </code><code>rm</code> <code>$(docker </code><code>ps</code> <code>-a -q)</code>

删除镜像 

<code>docker rmi &lt;image_id/image_name ...&gt;</code>

下面是一个完整的示例:

<code># docker images            &lt;==</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     &lt;==</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>先删除由这个镜像启动的容器    &lt;==</code>

<code># docker rm eef3648a6e77</code>

<code>删除镜像                    &lt;==</code>

<code>Deleted: 195eb90b534950d334188c3627f860fbdf898e224d8a0a11ec54ff453175e081</code>

<code>Deleted: 209ea56fda6dc2fb013e4d1e40cb678b2af91d1b54a71529f7df0bd867adc961</code>

<code>Deleted: 0f4aac48388f5d65a725ccf8e7caada42f136026c566528a5ee9b02467dac90a</code>

<code>Deleted: fae16849ebe23b48f2bedcc08aaabd45408c62b531ffd8d3088592043d5e7364</code>

<code>Deleted: f127542f0b6191e99bb015b672f5cf48fa79d974784ac8090b11aeac184eaaff</code>

注意,上面的删除过程我所举的例子比较特殊——镜像被tag在多个仓库,也有启动过的容器。按照<code>&lt;==</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 &amp;&amp; </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>---&gt; aa8516fa0bb7</code>

<code>Step 1 : EXPOSE 80</code>

<code> </code><code>---&gt; Using cache</code>

<code> </code><code>---&gt; fece07e2b515</code>

<code>Step 2 : ENTRYPOINT </code><code>/usr/sbin/nginx</code> <code>-c </code><code>/etc/nginx/nginx</code><code>.conf &amp;&amp; </code><code>/bin/bash</code>

<code> </code><code>---&gt; Running </code><code>in</code> <code>e08963fd5afb</code>

<code> </code><code>---&gt; 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 &lt;container_id/container_name&gt;</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

继续阅读