Docker从头开始:使用容器,第2部分

这是关于使用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容器紧密合作,请花些时间深入了解它们。 它将得到丰厚的回报。

翻译自: https://code.tutsplus.com/tutorials/docker-from-the-ground-up-working-with-container-part-2--cms-28486

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值