容器可以通过<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 <image_id></code>来同时删除剩下的<code>TAG</code>;若在不同Repo则还是需要手动逐个删除<code>TAG</code>;
还存在由这个镜像启动的container时(即便已经停止),也无法删除镜像;
TO-DO 如何查看镜像与容器的依存关系
删除容器
<code>docker rm <container_id/contaner_name></code>
删除镜像
<code>docker rmi <image_id/image_name ...></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>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 <container_id/container_name></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,如需转载请自行联系原作者