作者: 耗子007
所有命令均基于docker1.11版本
容器相关的命令,主要包括容器的管理、日志、信息查看以及内容操作。
注:由于有些命令比较复杂,限于篇幅可能需要单独开一章,进行详细分析。
容器管理
容器的管理涉及容器的整个生命周期:创建、启动、运行、挂起、唤醒、重启、停止、杀死以及删除。本文以容器的生命周期为主线一个个罗列相关命令。
容器的创建
1 |
|
注意:由于docker create的选项和docker run是一样的,因此这里不详细说明,等到docker run分析的时候,再详细分析。
create用于创建一个新的容器,主要工作有:
- 在指定镜像之上,创建容器的可写层;
- 并且准备容器运行指定的命令
- 输出容器ID到STDOUT
“docker create”和”docker run -d”是基本一样的,除了不启动容器外,当然,你可以在任何时候用docker start启动创建的容器。
介绍几个简单的使用示例:
创建并启动一个可交互的容器
1 | $ docker create -t -i fedora bash |
创建数据卷容器
这是由于v1.4.0后容器的数据卷是在create的阶段进行初始化的,因此create容器数据卷,然后直接在其他容器使用,如下:
1 | $ docker create -v /data --name data ubuntu |
更详细的分析参考docker run和Docker run refrence。
容器的启动
1 | Usage: docker start [OPTIONS] CONTAINER [CONTAINER...] |
start命令用于启动一个或者多个容器。start命令的几个参数选项的含义和其他命令的含义是一致的:
- -a:链接到容器的STDOUT/STDERR,而且可以接收到容器的信号
- –detach-keys:这个指定detach的快捷键
- -i:表示连接到容器的STDIN,这样才能做一些输入操作,例如敲bash命令
注意:这里的-a只是能接收STDOUT/STDERR的数据,如果另外一个shell窗口用docker exec -it连到一个容器,exec里面对容器的操作不会反抗到start -a的窗口。
有点类似于-a是串口,而exec是ssh登录进去的情况。
容器的运行
run命令可以用于直接运行容器,可以理解为run = create + start,由于这部分内容比较多,单独用一篇文章描述。
容器的挂起
1 | Usage: docker pause [OPTIONS] CONTAINER [CONTAINER...] |
pause命令可以暂停一个容器内所有的进程。
容器的唤醒
1 | Usage: docker unpause [OPTIONS] CONTAINER [CONTAINER...] |
unpause命令与pause命令相对应,用于唤醒一个容器内所有的进程。
容器的重启
1 | Usage: docker restart [OPTIONS] CONTAINER [CONTAINER...] |
restart命令用于重启一个容器,可以用-t设置等待容器停止的时间,超时则杀死容器。
容器的停止
1 | Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...] |
stop命令可以通过发送SIGTERM以及合理间隔后发送的SIGKILL来停止一个容器,-t选项和restart的用法一致。
注:只有容器的主进程才会收到SIGTERM信号,并且在合理间隔之后收到SIGKILL信号。
容器的杀死
1 | Usage: docker kill [OPTIONS] CONTAINER [CONTAINER...] |
kill命令通过SIGKILL或者其他指定信号来杀死一个运行中的容器,-s选项可以指定一个发送给容器的信号。
和stop一样,主进程会收到信号。
注意:如果ENTRYPOINT和CMD是以shell格式运行的,那么他们是不会收到信号的。这是由于这种情况下bash才是主进程,
只有PID为1的进程能收到。关于ENTRYPOINT和CMD可以参考官方文档
容器的删除
1 | Usage: docker rm [OPTIONS] CONTAINER [CONTAINER...] |
rm可以删除一个或者多个容器。
可以通过指定–force选项,通过发送SIGKILL信号强制删除一个运行的容器,例如:docker rm –force redis
可以通过–link删除默认网桥上指定的link,删除所有的网络配置,例如:docker rm –link /webapp/redis
注意:–link不能删除用户指定的网络,只能删除默认网桥上的link。
可以通过–volumes删除容器关联的数据卷,这里需要注意下面的情况:
1 | $ docker create -v awesome:/foo -v /bar --name hello redis |
这里只会删除/bar数据卷,/foo数据卷不会被删除,是由于/foo关联到host的文件或者目录awesome。
删除所有停止的容器:docker rm $(docker ps -a -q)
容器的重命名
1 | Usage: docker rename [OPTIONS] OLD_NAME NEW_NAME |
rename命令可以用于重命名容器。
注意:如果你启动的时候没有指定容器的名字,docker会生成一个,但是你也可以用容器的ID作为OLD_NAME来重命名该容器。
例如:docker rename b8929ca5eda3 haozi
容器的更新
update命令用于更新容器的一些配置,详细可以参考update命令分析
关于容器生命周期相关的命令,就结束了。下面看看其他和容器相关的一些常用的命令。
attach和exec命令
首先,attach可以挂到一个运行的容器上,而exec可以在容器内执行指定的命令。
1 | Usage: docker attach [OPTIONS] CONTAINER |
attach命令可以挂到一个运行中的容器上,然后你可以看到该容器正在输出的内容,或者以交互的方式控制它。
停止一个容器默认使用Ctrl-c,这个组合键会发送一个SIGKILL信号给容器。但是–sig-proxy=true被设置的话,
Ctrl-c会发送SIGINT给容器。可以通过Ctrl+p,Ctrl+q端口连接并保持容器运行。
注意:通过attach连接到容器的stdio,Docker提供1MB的缓存接收应用的输出,如果buffer满了,会影响attach的输出速度。
然后,exec可以在运行的容器中运行一条命令。当容器运行的第一条命令不是bash或者没有指定-it的时候,用attach连到容器是不能做一些输入或者指令操作的。
但是我们可以用exec在容器内运行bash或者其他指令来达到操作容器的目的。
1 | Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...] |
注:exec只有在容器的第一个进程在运行时,才能执行。如果容器是pause状态,exec会返回失败。
各选项作用:
- –detach:后台执行命令
- –detach-keys:指定断开连接的快捷键
- –interactive:支持输入
- –privileged:设置运行命令在特权模式下运行
- –tty:分配一个伪终端
- –user:设置执行命令用户名
容器的日志
1 | Usage: docker logs [OPTIONS] CONTAINER |
logs命令可以获取容器的日志信息。logs的日志信息保存位置取决于日志的驱动,
默认容器日志的驱动为json,数据保存在/var/lib/docker/containers/container-ID/container-ID-json.log文件。
日志驱动可以通过docker run和docker daemon的–log-driver选项设置。
logs命令的选项作用:
- –follow:命令可以持续获取容器的STDOUT和STDERR的信息。
- –since:命令值显示指定时间戳之后的日志
- –timestamps:命令在每条日志之前加上时间戳
- –tail:命令只显示日志最后的指定行数