天天看点

docker专题(2):docker常用管理命令(下)

容器可以通过<code>run</code>新建一个来运行,也可以重新<code>start</code>已经停止的container,但<code>start</code>不能够再指定容器启动时运行的指令,因为docker只能有一个前台进程。

容器stop(或<code>Ctrl+D</code>)时,会在保存当前容器的状态之后退出,下次start时保有上次关闭时更改。而且每次进入<code>attach</code>进去的界面是一样的,与第一次run启动或commit提交的时刻相同。

要<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>inspect</code>的对象可以是image、运行中的container和停止的container。

你可能在使用过程中会<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>docker rmi &lt;image_id/image_name ...&gt;</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>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>来保留容器。

TO-DO

<code>docker build github.com/creack/docker-firefox</code>失败。

tag的作用主要有两点:一是为镜像起一个容易理解的名字,二是可以通过<code>docker tag</code>来重新指定镜像的仓库,这样在<code>push</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的子进程就对了。

docker还有一些如<code>login</code>、<code>cp</code>、<code>logs</code>、<code>export</code>、<code>import</code>、<code>load</code>、<code>kill</code>等不是很常用的命令,比较简单,请参考官网。

本文转自 h2appy  51CTO博客,原文链接:http://blog.51cto.com/h2appy/1865360,如需转载请自行联系原作者

继续阅读