0%

docker命令分析--容器相关


作者: 耗子007


所有命令均基于docker1.11版本

容器相关的命令,主要包括容器的管理、日志、信息查看以及内容操作。
注:由于有些命令比较复杂,限于篇幅可能需要单独开一章,进行详细分析。

容器管理

容器的管理涉及容器的整个生命周期:创建、启动、运行、挂起、唤醒、重启、停止、杀死以及删除。本文以容器的生命周期为主线一个个罗列相关命令。

容器的创建

1
2
3
4
5

Usage: docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

Create a new container
......

注意:由于docker create的选项和docker run是一样的,因此这里不详细说明,等到docker run分析的时候,再详细分析。
create用于创建一个新的容器,主要工作有:

  • 在指定镜像之上,创建容器的可写层;
  • 并且准备容器运行指定的命令
  • 输出容器ID到STDOUT

“docker create”和”docker run -d”是基本一样的,除了不启动容器外,当然,你可以在任何时候用docker start启动创建的容器。
介绍几个简单的使用示例:
创建并启动一个可交互的容器

1
2
3
4
$ docker create -t -i fedora bash
6d8af538ec541dd581ebc2a24153a28329acb5268abe5ef868c1f1a261221752
$ docker start -a -i 6d8af538ec5
bash-4.2#

创建数据卷容器

这是由于v1.4.0后容器的数据卷是在create的阶段进行初始化的,因此create容器数据卷,然后直接在其他容器使用,如下:

1
2
3
4
5
6
$ docker create -v /data --name data ubuntu
240633dfbb98128fa77473d3d9018f6123b99c454b3251427ae190a7d951ad57
$ docker run --rm --volumes-from data ubuntu ls -la /data
total 8
drwxr-xr-x 2 root root 4096 Dec 5 04:10 .
drwxr-xr-x 48 root root 4096 Dec 5 04:11 ..

更详细的分析参考docker runDocker run refrence

容器的启动

1
2
3
4
5
6
7
8
Usage: docker start [OPTIONS] CONTAINER [CONTAINER...]

Start one or more containers

-a, --attach Attach STDOUT/STDERR and forward signals
--detach-keys Specify the escape key sequence used to detach a container
--help Print usage
-i, --interactive Attach container STDIN

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
2
3
4
5
Usage: docker pause [OPTIONS] CONTAINER [CONTAINER...]

Pause all processes within a container

--help Print usage

pause命令可以暂停一个容器内所有的进程。

容器的唤醒

1
2
3
4
5
Usage: docker unpause [OPTIONS] CONTAINER [CONTAINER...]

Unpause all processes within a container

--help Print usage

unpause命令与pause命令相对应,用于唤醒一个容器内所有的进程。

容器的重启

1
2
3
4
5
6
Usage: docker restart [OPTIONS] CONTAINER [CONTAINER...]

Restart a container

--help Print usage
-t, --time=10 Seconds to wait-for-stop before killing the container

restart命令用于重启一个容器,可以用-t设置等待容器停止的时间,超时则杀死容器。

容器的停止

1
2
3
4
5
6
7
Usage: docker stop [OPTIONS] CONTAINER [CONTAINER...]

Stop a container by sending SIGTERM and then SIGKILL after a
grace period

--help Print usage
-t, --time=10 Seconds to wait-for-stop before killing it

stop命令可以通过发送SIGTERM以及合理间隔后发送的SIGKILL来停止一个容器,-t选项和restart的用法一致。
注:只有容器的主进程才会收到SIGTERM信号,并且在合理间隔之后收到SIGKILL信号。

容器的杀死

1
2
3
4
5
6
Usage: docker kill [OPTIONS] CONTAINER [CONTAINER...]

Kill a running container using SIGKILL or a specified signal

--help Print usage
-s, --signal="KILL" Signal to send to the container

kill命令通过SIGKILL或者其他指定信号来杀死一个运行中的容器,-s选项可以指定一个发送给容器的信号。
和stop一样,主进程会收到信号。

注意:如果ENTRYPOINT和CMD是以shell格式运行的,那么他们是不会收到信号的。这是由于这种情况下bash才是主进程,
只有PID为1的进程能收到。关于ENTRYPOINT和CMD可以参考官方文档

容器的删除

1
2
3
4
5
6
7
8
Usage: docker rm [OPTIONS] CONTAINER [CONTAINER...]

Remove one or more containers

-f, --force Force the removal of a running container (uses SIGKILL)
--help Print usage
-l, --link Remove the specified link
-v, --volumes Remove the volumes associated with the container

rm可以删除一个或者多个容器。
可以通过指定–force选项,通过发送SIGKILL信号强制删除一个运行的容器,例如:docker rm –force redis
可以通过–link删除默认网桥上指定的link,删除所有的网络配置,例如:docker rm –link /webapp/redis
注意:–link不能删除用户指定的网络,只能删除默认网桥上的link。
可以通过–volumes删除容器关联的数据卷,这里需要注意下面的情况:

1
2
3
$ docker create -v awesome:/foo -v /bar --name hello redis
hello
$ docker rm -v hello

这里只会删除/bar数据卷,/foo数据卷不会被删除,是由于/foo关联到host的文件或者目录awesome。

删除所有停止的容器:docker rm $(docker ps -a -q)

容器的重命名

1
2
3
4
5
Usage: docker rename [OPTIONS] OLD_NAME NEW_NAME

Rename a container

--help Print usage

rename命令可以用于重命名容器。
注意:如果你启动的时候没有指定容器的名字,docker会生成一个,但是你也可以用容器的ID作为OLD_NAME来重命名该容器。
例如:docker rename b8929ca5eda3 haozi

容器的更新

update命令用于更新容器的一些配置,详细可以参考update命令分析

关于容器生命周期相关的命令,就结束了。下面看看其他和容器相关的一些常用的命令。

attach和exec命令

首先,attach可以挂到一个运行的容器上,而exec可以在容器内执行指定的命令。

1
2
3
4
5
6
7
8
Usage: docker attach [OPTIONS] CONTAINER

Attach to a running container

--detach-keys="<sequence>" Set up escape key sequence
--help Print usage
--no-stdin Do not attach STDIN
--sig-proxy=true Proxy all received signals to the process

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
2
3
4
5
6
7
8
9
10
11
Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container

-d, --detach Detached mode: run command in the background
--detach-keys Specify the escape key sequence used to detach a container
--help Print usage
-i, --interactive Keep STDIN open even if not attached
--privileged Give extended Linux capabilities to the command
-t, --tty Allocate a pseudo-TTY
-u, --user= Username or UID (format: <name|uid>[:<group|gid>])

注:exec只有在容器的第一个进程在运行时,才能执行。如果容器是pause状态,exec会返回失败。
各选项作用:

  • –detach:后台执行命令
  • –detach-keys:指定断开连接的快捷键
  • –interactive:支持输入
  • –privileged:设置运行命令在特权模式下运行
  • –tty:分配一个伪终端
  • –user:设置执行命令用户名

容器的日志

1
2
3
4
5
6
7
8
9
Usage: docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

-f, --follow Follow log output
--help Print usage
--since="" Show logs since timestamp
-t, --timestamps Show timestamps
--tail="all" Number of lines to show from the end of the logs

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:命令只显示日志最后的指定行数