如何使用 docker stack services 命令列出服务

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何有效地使用 docker stack services 命令来管理和检查 Docker 栈(stack)内的服务。我们将首先使用 Docker Compose 设置一个简单的 Docker 栈,这包括安装 Docker Compose 并部署 docker-compose.yml 文件中定义的基本应用程序。

一旦栈开始运行,你将探索 docker stack services 的核心功能,以列出栈中的所有服务。在此基础上,你将学习如何通过基于服务名称和 ID 进行过滤来优化服务列表。最后,你将了解如何自定义服务列表的输出格式,以便以清晰、有条理的方式显示你需要的信息。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") subgraph Lab Skills docker/ps -.-> lab-555238{{"如何使用 docker stack services 命令列出服务"}} docker/rm -.-> lab-555238{{"如何使用 docker stack services 命令列出服务"}} docker/network -.-> lab-555238{{"如何使用 docker stack services 命令列出服务"}} end

列出栈中的所有服务

在这一步中,你将学习如何列出 Docker 栈(stack)中运行的所有服务。在列出服务之前,我们需要有一个正在运行的栈。由于 Docker Compose 没有预先安装,我们将首先安装它,然后部署一个简单的栈。

首先,让我们安装 Docker Compose。我们将下载二进制文件并使其可执行。

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

现在 Docker Compose 已安装,让我们创建一个简单的 docker-compose.yml 文件来定义我们的栈。我们将在 ~/project 目录中创建一个名为 docker-compose.yml 的文件。

nano ~/project/docker-compose.yml

将以下内容添加到文件中:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  app:
    image: alpine:latest
    command: sleep 3600

此文件定义了一个包含两个服务的栈:使用 nginx 镜像的 web 服务和使用 alpine 镜像的 app 服务。web 服务将主机上的 80 端口映射到容器内的 80 端口。app 服务只是运行 sleep 3600 命令以保持容器运行。

保存文件并退出编辑器(在 nano 中按 Ctrl+X,Y,Enter)。

现在,让我们使用 docker stack deploy 部署栈。我们将把栈命名为 mystack

docker stack deploy -c ~/project/docker-compose.yml mystack

此命令读取 docker-compose.yml 文件,并将其中定义的服务创建为一个名为 mystack 的 Docker 栈。你应该会看到表明正在创建服务的输出。

栈部署完成后,你可以使用 docker stack services 命令并指定栈名来列出栈中的所有服务。

docker stack services mystack

此命令将显示一个表格,展示 mystack 栈中服务的相关信息,包括它们的 ID、名称、模式、副本数、镜像和端口。

你应该会看到类似于以下的输出:

ID             NAME                 MODE         REPLICAS   IMAGE          PORTS
xxxxxxxxxxxx   mystack_app          replicated   1/1        alpine:latest
xxxxxxxxxxxx   mystack_web          replicated   1/1        nginx:latest   *:80->80/tcp

输出列出了 mystack_appmystack_web 服务,确认它们作为 mystack 栈的一部分正在运行。

按名称过滤服务

在这一步中,你将学习如何根据服务名称过滤 Docker 栈(stack)中的服务列表。当栈中有许多服务,而你只想查看特定服务的信息时,这非常有用。

docker stack services 命令支持 --filter 标志,它允许你指定过滤输出的条件。要按服务名称过滤,可以使用 name 过滤器。

按名称过滤的语法是 --filter name=<service_name>。请记住,栈中的服务名称通常以栈名作为前缀,后面跟着一个下划线和 docker-compose.yml 文件中定义的服务名称(例如,mystack_web)。

让我们过滤 mystack 栈中的服务,只显示 web 服务。

docker stack services mystack --filter name=mystack_web

此命令将只显示与 mystack_web 服务对应的行。

你应该会看到类似于以下的输出:

ID             NAME                 MODE         REPLICAS   IMAGE          PORTS
xxxxxxxxxxxx   mystack_web          replicated   1/1        nginx:latest   *:80->80/tcp

注意,只显示了 mystack_web 服务的信息。

同样,你可以过滤以只查看 app 服务:

docker stack services mystack --filter name=mystack_app

这将显示 mystack_app 服务的信息:

ID             NAME                 MODE         REPLICAS   IMAGE
xxxxxxxxxxxx   mystack_app          replicated   1/1        alpine:latest

使用 name 过滤器可以让你在大型栈中快速查找并查看特定服务的详细信息。

按 ID 过滤服务

在这一步中,你将学习如何根据服务的唯一 ID 过滤 Docker 栈(stack)中的服务列表。虽然按名称过滤通常更直观,但当你需要绝对精确,或者处理名称可能相似的服务时,按 ID 过滤就很有用。

Docker 栈中的每个服务都被分配了一个唯一的 ID。你可以在 docker stack services 输出的第一列中看到这些 ID。

要按服务 ID 过滤,你可以使用带有 id 过滤器的 --filter 标志。语法是 --filter id=<service_id>。你只需要提供足够长的 ID 前缀来唯一标识该服务即可。

首先,让我们再次列出所有服务以获取它们的 ID。

docker stack services mystack

查看输出并确定 mystack_webmystack_app 服务的 ID。这些 ID 将是一串十六进制字符。例如,输出可能如下所示(你的 ID 会不同):

ID             NAME                 MODE         REPLICAS   IMAGE          PORTS
xxxxxxxxxxxx   mystack_app          replicated   1/1        alpine:latest
yyyyyyyyyyyy   mystack_web          replicated   1/1        nginx:latest   *:80->80/tcp

假设 mystack_web 的 ID 以 yyyyyyyyyyyy 开头。你可以按此 ID(或更短的唯一前缀)进行过滤,如下所示:

docker stack services mystack --filter id=yyyyyyyyyyyy

yyyyyyyyyyyy 替换为你实际的 mystack_web 服务 ID 的开头部分。

此命令将只显示具有匹配 ID 的服务的行。

你应该会看到类似于以下的输出,只显示 mystack_web 服务:

ID             NAME                 MODE         REPLICAS   IMAGE          PORTS
yyyyyyyyyyyy   mystack_web          replicated   1/1        nginx:latest   *:80->80/tcp

同样,你可以按 mystack_app 服务的 ID 进行过滤。从 docker stack services mystack 的输出中找到它的 ID,并在过滤器中使用。例如,如果 ID 以 xxxxxxxxxxxx 开头:

docker stack services mystack --filter id=xxxxxxxxxxxx

xxxxxxxxxxxx 替换为你实际的 mystack_app 服务 ID 的开头部分。

这将显示 mystack_app 服务的信息:

ID             NAME                 MODE         REPLICAS   IMAGE
xxxxxxxxxxxx   mystack_app          replicated   1/1        alpine:latest

按 ID 过滤提供了一种精确的方式来定位特定服务,特别是在自动化脚本中,或者处理名称可能相似的服务时。

格式化服务列表的输出

在这一步中,你将学习如何格式化 docker stack services 命令的输出。默认情况下,输出以人类可读的表格格式显示。不过,你可以使用 --format 标志来自定义输出,这在编写脚本或需要以不同格式获取特定信息时特别有用。

--format 标志接受一个 Go 模板字符串。这使你能够精确指定要显示哪些字段以及如何格式化它们。你可能想要显示的常见字段包括 .ID.Name.Image.Mode.Replicas.Ports

让我们尝试格式化输出,只显示服务 ID、名称和镜像,并用制表符分隔。

docker stack services mystack --format "{{.ID}}\t{{.Name}}\t{{.Image}}"

在这个命令中:

  • {{.ID}}{{.Name}}{{.Image}} 是 Go 模板占位符,将被每个服务的相应值替换。
  • \t 表示制表符,在这里用作分隔符。

现在输出将是一个服务列表,每行包含 ID、名称和镜像,用制表符分隔:

xxxxxxxxxxxx	mystack_app	alpine:latest
yyyyyyyyyyyy	mystack_web	nginx:latest

(请记住,在你的环境中 ID 会有所不同)。

你还可以将输出格式化为列表,在某些情况下这样更容易解析。例如,列出服务名称和副本数量:

docker stack services mystack --format "- {{.Name}} (Replicas: {{.Replicas}})"

这将输出:

- mystack_app (Replicas: 1/1)
- mystack_web (Replicas: 1/1)

--format 标志提供了一种强大的方式来根据你的特定需求定制 docker stack services 的输出,使其更易于与其他工具或脚本集成。

最后,让我们通过移除已部署的栈来清理环境。

docker stack rm mystack

这个命令将移除与 mystack 栈关联的所有服务和网络。你应该会看到表明栈正在被移除的输出。

总结

在本次实验中,你学习了如何使用 docker stack services 命令列出 Docker 栈(stack)中的服务。这包括首先安装 Docker Compose 并部署一个在 docker-compose.yml 文件中定义的简单栈。然后,你使用 docker stack services <stack_name> 来显示已部署栈中所有服务的表格。

本次实验还介绍了如何按名称和 ID 过滤服务,使你能够将列表缩小到特定的服务。最后,你探索了如何格式化 docker stack services 命令的输出,以自定义显示的信息。