这是关于使用Docker容器的两部分系列的第二部分。 在第一部分中 ,我们重点介绍了运行映像的多种方法和选项,以及主机如何与Docker容器进行交互。
在这一部分中,我们将介绍列出,启动,停止和重新启动容器,以及在正在运行的容器上执行命令。 特别是,您将学习运行和停止(退出)容器之间的区别,以及如何通过过滤和格式化列出容器时如何精确控制信息和显示。
然后,您将获得停止,启动,重新启动并附加到容器的动手经验。 最后,您将运行一次性命令,并获得对正在运行的容器的交互式Shell访问。
在开始之前,请确保已在您的环境中正确安装了Docker。 根据安装方式和用户的不同,您可能需要以sudo身份运行它。 我将跳过sudo。
列出容器
使用容器时,您通常希望列出,查看和过滤容器。 docker ps
命令是关键,它有几个有趣的选项。
运行容器
最基本的命令是不带参数的普通docker ps
,它显示所有当前正在运行的容器。
$ docker ps
CONTAINER ID IMAGE COMMAND
CREATED STATUS PORTS
NAMES
2f542e1cb88b nginx "nginx -g 'daemon ..."
12 hours ago Up 12 hours 443/tcp, 0.0.0.0:9000->80/tcp
nginx
您会在每个容器上获得很多信息,包括容器ID,图像,命令,创建时的命令,其当前状态,端口和名称。 由于包装问题,解析起来有些困难。 稍后我们将看到如何过滤和格式化输出。 请注意,命令将被截断(以及容器ID)。 要显示完整的命令,请添加--no-trunc
:
$ docker ps --no-trunc
IMAGE COMMAND
nginx "nginx -g 'daemon off;'"
现在,完整的命令可见: nginx -g 'daemon off;'
所有货柜
您还记得,Docker保持停止的容器存在(除非您使用--rm
运行它们)。 添加-a
显示所有容器:
$ docker ps -a
CONTAINER ID IMAGE STATUS NAMES
cc797c61dc21 busybox Exited busybox
67f3cb5a9647 busybox Exited ecstatic_jones
898fb562e535 hello-world Exited hopeful_spence
6dd210fda2d8 hello-world Created infallible_curie
2f542e1cb88b nginx Up 12 hours nginx
格式化
docker ps
的输出可能太冗长,并且经常显示很多没有意思的字段。 您可以使用Go-template格式仅显示您感兴趣的字段。这里仅显示名称和命令:
$ docker ps --no-trunc --format '{{.Names}}\t{{.Command}}'
nginx "nginx -g 'daemon off;'"
可以,但是要使用字段名称显示它,请在格式字符串的开头添加“表格”:
$ docker ps -a --no-trunc --format 'table {{.Names}}\t{{.Command}}'
NAMES COMMAND
busybox "cat /data/1.txt"
ecstatic_jones "cat /data/1.txt"
hopeful_spence "/hello"
infallible_curie "ls -la"
nginx "nginx -g 'daemon off;'"
容器ID(此处未选择)的格式名称为{{.ID}}
(全部大写)。
筛选
docker ps
命令支持许多过滤器。 它们非常易于使用。 语法为-f "<filter>=<value>"
。 支持的过滤器包括ID,标签,名称,退出,状态,祖先,隔离之前,隔离之后,网络和运行状况。
以下是按容器名称过滤并仅显示busybox容器的信息:
$ docker ps -a -f "name=busybox" \
--format 'table {{.ID}}\t{{.Status}}\t{{.Names}}'
CONTAINER ID STATUS NAMES
cc797c61dc21 Exited (0) 11 minutes ago busybox
-q标志
如果只需要容器ID,请使用-q flag
(安静标志)。 它比--format 'table {{.ID}}'
更简单。 当您想对多个容器执行操作时通常需要这样做(稍后将看到一个示例)。
$ docker ps -aq
cc797c61dc21
67f3cb5a9647
898fb562e535
6dd210fda2d8
2f542e1cb88b
停止,启动和重新启动容器
您可以停止运行容器并启动已停止的容器。 启动已停止的容器和运行同一图像的新实例之间有几个区别:
- 您使用与原始run命令相同的环境变量,卷,端口和其他参数。
- 您不必创建另一个容器。
- 如果停止的实例修改了其文件系统,则启动的容器将使用相同的文件系统。
让我们停止nginx容器,然后启动它。 引用容器时,可以使用其名称或ID的明确前缀。 我通常为长期运行的容器命名,这样我就有了有意义的句柄,而不必处理Docker的自动生成的名称或容器的ID前缀。
$ docker stop nginx
nginx
$ docker ps -a -f "name=nginx" --format 'table {{.Names}}\t{{.Status}}'
NAMES STATUS
nginx Exited (0) 2 minutes ago
好。 Nginx已停止(状态为“已退出”)。 让我们开始吧:
$ docker start nginx
nginx
$ docker ps -a -f "name=nginx" --format 'table {{.Names}}\t{{.Status}}'
NAMES STATUS
nginx Up 33 seconds
重新启动正在运行的容器是另一种选择,等效于docker stop
后跟docker start
。
$ docker restart nginx
nginx
$ docker ps -a -f "name=nginx" --format 'table {{.Names}}\t{{.Status}}'
NAMES STATUS
nginx Up 2 seconds
附加到正在运行的容器
启动已停止的容器时,或者以分离模式运行容器( -d
命令行参数)时,看不到输出。 但是您可以附加它。
$ docker attach nginx
172.17.0.1 - - [19/Mar/2017:08:40:03 +0000] "HEAD / HTTP/1.1" 200 0 "-"
"HTTPie/0.8.0" "-"
卸下容器
您可以使用以下命令删除已停止的容器: docker rm <container id or name>
$ docker rm ecstatic_jones
ecstatic_jones
如果要删除正在运行的容器,可以先停止它,也可以使用-f
(force)命令行参数:
$ docker rm -nginx
Error response from daemon: You cannot remove a running container
3dbffa955f906e427298fbeb3eadfd229d64365dd880c9771a31b0aedb879d6d.
Stop the container before attempting removal or use -f
$ docker rm -f -nginx
nginx
如果要删除所有容器,以下是一个不错的代码段:
docker rm -f $(docker ps -aq)
如果只想删除已停止的容器,请删除-f
(强制)标志。
在正在运行的容器中执行命令
Docker在容器内运行单个进程,但是您可以对正在运行的容器执行其他命令。 这与向docker run
命令提供自定义命令非常相似,除了在这种情况下,它与run命令并排运行。
简单命令
运行简单的命令是通过docker exec
完成的。 您提供一个正在运行的容器ID或名称以及要执行的命令。 让我们检查一下nginx容器内的nginx.conf文件,看看配置了多少个工作进程。
$ docker exec nginx cat /etc/nginx/nginx.conf | grep worker_processes
worker_processes 1;
互动壳
使用Docker容器的最佳故障排除技术之一是连接到交互式外壳,然后仅浏览内部文件系统。 为了附加stdin并包含tty ,您需要提供-i -t
命令行参数(可以分组为-it
),然后提供shell可执行文件的名称(通常为bash )。
您最终将获得对容器的外壳访问。 这是一个从容器“内部”以交互方式检查工作进程的示例。
$ docker exec -it nginx bash
root@b010e854bb98:/# cat /etc/nginx/nginx.conf | grep worker_processes
worker_processes 1;
root@b010e854bb98:/#
结论
Docker是一个功能强大的平台,由于容器是其工作单元,因此它提供了许多工具来管理和使用容器。 我描述了使用容器的大多数重要方面,但是我所介绍的命令还有许多其他高级功能,选项和细微差别。
如果您与Docker容器紧密合作,请花些时间深入了解它们。 它将得到丰厚的回报。