如何使用 docker stack ps 命令列出栈任务

DockerDockerBeginner
立即练习

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

简介

在这个实验中,你将学习如何有效使用 docker stack ps 命令来列出和管理 Docker 栈(stack)中的任务。你将首先使用 Docker Compose(一个用于定义和运行多容器应用程序的强大工具)部署一个示例栈。

在栈部署完成后,你将探索 docker stack ps 的各种功能。这包括列出栈中的所有任务、根据任务名称过滤任务、格式化输出以显示你感兴趣的特定字段,最后,仅显示任务 ID 以获得简洁的视图。通过这个实践经验,你将掌握监控和了解 Docker 栈任务状态的技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/ps -.-> lab-555236{{"如何使用 docker stack ps 命令列出栈任务"}} docker/rm -.-> lab-555236{{"如何使用 docker stack ps 命令列出栈任务"}} docker/pull -.-> lab-555236{{"如何使用 docker stack ps 命令列出栈任务"}} end

部署示例栈

在这一步中,你将学习如何使用 Docker Compose 部署一个示例栈。Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose 时,你可以使用 YAML 文件来配置应用程序的服务。然后,只需一个命令,你就可以根据配置创建并启动所有服务。

由于 Docker Compose 并未预先安装在 LabEx 环境中,你需要先进行安装。我们将安装 1.29.2 版本的 Docker Compose,该版本与已安装的 Docker 版本兼容。

首先,下载 Docker Compose 二进制文件:

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

此命令从官方 GitHub 仓库下载 Docker Compose 二进制文件,并将其保存到 /usr/local/bin/docker-compose$(uname -s)$(uname -m) 部分会自动检测你的操作系统和架构。

接下来,为二进制文件添加可执行权限:

sudo chmod +x /usr/local/bin/docker-compose

此命令使下载的文件具有可执行权限。

现在,通过检查 Docker Compose 版本来验证安装情况:

docker-compose --version

你应该会看到类似于 docker-compose version 1.29.2, build 5becea4c 的输出。

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

使用 nano 编辑器创建并编辑该文件:

nano ~/project/docker-compose.yml

将以下内容粘贴到 docker-compose.yml 文件中:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  app:
    image: alpine:latest
    command: echo "Hello from Alpine"

这个 docker-compose.yml 文件定义了两个服务:

  • web:使用 nginx:latest 镜像,并将主机的 80 端口映射到容器的 80 端口。
  • app:使用 alpine:latest 镜像,并运行一个简单的 echo 命令。

Ctrl + S 保存文件,按 Ctrl + X 退出编辑器。

在部署栈之前,让我们拉取必要的镜像。虽然 Docker Compose 可以在部署期间自动拉取镜像,但提前显式拉取有时会很有帮助。

拉取 nginx:latest 镜像:

docker pull nginx:latest

拉取 alpine:latest 镜像:

docker pull alpine:latest

现在,使用 docker-compose up 命令部署栈。-d 标志表示以分离模式(在后台)运行容器。

导航到你创建 docker-compose.yml 文件的 ~/project 目录:

cd ~/project

然后,运行命令:

docker-compose up -d

此命令会读取 docker-compose.yml 文件,并创建和启动定义的服务。你应该会看到指示 webapp 服务已创建并启动的输出。

要验证服务是否正在运行,你可以列出正在运行的容器:

docker ps

你应该会看到两个正在运行的容器,一个是 web 服务(基于 nginx)的,另一个是 app 服务(基于 alpine)的。

列出栈中的所有任务

在这一步中,你将学习如何列出与上一步中部署的栈相关的所有任务(容器)。在 Docker Swarm 或 Kubernetes 中,“任务”一词通常用于指代服务的运行实例。虽然我们在这里使用的是 Docker Compose,它在技术上不像 Swarm 那样使用“任务”概念,但我们仍然可以列出构成已部署栈的容器。

docker-compose ps 命令用于列出 Docker Compose 为当前项目(包含 docker-compose.yml 文件的目录)管理的容器。

确保你仍然位于包含 docker-compose.yml 文件的 ~/project 目录中:

cd ~/project

现在,运行 docker-compose ps 命令:

docker-compose ps

此命令将显示 docker-compose.yml 文件中定义的容器列表,以及它们的当前状态、命令和端口。

你应该会看到类似于以下的输出(容器名称和 ID 会有所不同):

      Name                     Command               State          Ports
--------------------------------------------------------------------------------
project_app_1       /bin/sh -c echo "Hello fr ...   Exit 0
project_web_1       /docker-entrypoint.sh ngin ...   Up      0.0.0.0:80->80/tcp

此输出显示了 docker-compose.yml 中定义的两个服务:appwebState 列指示容器是正在运行(Up)还是已退出(Exit 0)。Ports 列显示了 web 服务的端口映射。

app 容器已退出,因为其命令 echo "Hello from Alpine" 执行完毕。web 容器仍在运行,因为 Nginx 服务器被设计为持续运行。

此命令有助于快速查看栈中哪些服务正在运行以及它们的基本状态。

按名称过滤任务

在这一步中,你将学习如何根据服务名称过滤 Docker Compose 管理的容器列表。当你有一个包含许多服务的大型栈,并且只想查看特定服务的状态时,这非常有用。

docker-compose ps 命令允许你指定服务名称作为参数来过滤输出。

确保你位于 ~/project 目录中:

cd ~/project

要仅列出 web 服务的容器,请运行以下命令:

docker-compose ps web

此命令将仅显示与 docker-compose.yml 中定义的 web 服务关联的容器信息。

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

      Name                     Command               State          Ports
--------------------------------------------------------------------------------
project_web_1       /docker-entrypoint.sh ngin ...   Up      0.0.0.0:80->80/tcp

同样,要仅列出 app 服务的容器,请运行:

docker-compose ps app

这将显示 app 容器的信息:

      Name                     Command               State          Ports
--------------------------------------------------------------------------------
project_app_1       /bin/sh -c echo "Hello fr ...   Exit 0

按服务名称过滤是一种简单而有效的方法,可用于管理和监控 Docker Compose 栈中的各个组件。

格式化输出以显示特定字段

在这一步中,你将学习如何格式化 docker-compose ps 命令的输出,使其仅显示特定字段。当你需要提取服务的特定信息(如名称或状态)以用于脚本编写或进一步处理时,这非常有用。

docker-compose ps 命令支持 --format 标志,该标志允许你使用 Go 模板指定输出格式。

确保你位于 ~/project 目录中:

cd ~/project

要仅显示服务名称和容器状态,你可以使用以下命令:

docker-compose ps --format "table {{.Service}}\t{{.State}}"

让我们来分析一下 --format 标志:

  • "table":这指定输出应以带有标题的表格格式呈现。
  • {{.Service}}:这是一个 Go 模板占位符,表示服务名称。
  • \t:这是一个制表符,用于分隔列。
  • {{.State}}:这是一个 Go 模板占位符,表示容器状态。

输出将如下所示:

SERVICE         STATE
app             Exit 0
web             Up

你也可以在格式字符串中包含其他字段。例如,要显示服务名称、镜像和状态:

docker-compose ps --format "table {{.Service}}\t{{.Image}}\t{{.State}}"

输出将是:

SERVICE         IMAGE           STATE
app             alpine:latest   Exit 0
web             nginx:latest    Up

使用 --format 标志可以灵活地查看和处理 Docker Compose 服务的信息。

仅显示任务 ID

在这一步中,你将学习如何仅显示 Docker Compose 栈中服务的容器 ID。当你需要将容器 ID 传递给其他命令以实现自动化或脚本编写时,这尤其有用。

我们将再次在 docker-compose ps 命令中使用 --format 标志,但这次我们将仅指定容器 ID 字段。

确保你位于 ~/project 目录中:

cd ~/project

要仅显示容器 ID,请使用以下命令:

docker-compose ps -q

-q 标志是 --quiet 的简写,它仅打印容器 ID。

或者,你也可以使用 --format 标志达到相同的效果:

docker-compose ps --format "{{.ID}}"

此命令使用 Go 模板 {{.ID}} 仅提取每个服务的容器 ID。

这两个命令的输出都将是一个容器 ID 列表,每行一个:

<container_id_for_app>
<container_id_for_web>

(实际的 ID 在你的环境中会有所不同)。

当你需要以编程方式与容器进行交互(例如停止或移除它们)时,仅显示 ID 是一个常见的需求。

最后,让我们通过停止部署的栈来清理环境。这将停止并移除由 docker-compose up 创建的容器和网络。

确保你位于 ~/project 目录中:

cd ~/project

运行以下命令:

docker-compose down

此命令将停止并移除 webapp 服务的容器。你应该会看到表明容器和网络正在被移除的输出。

运行 docker-compose down 后,你可以使用 docker ps 验证容器是否已停止运行:

docker ps

此命令现在应该不会显示正在运行的容器。

总结

在这个实验中,你学习了如何使用 Docker Compose 部署一个示例栈。这包括安装 Docker Compose、创建 docker-compose.yml 文件来定义服务,然后部署该栈。

部署完成后,你将学习如何使用 docker stack ps 命令列出已部署栈中的所有任务。你还将探索如何按名称过滤这些任务、格式化输出以显示特定字段,以及仅显示任务 ID,这展示了 docker stack ps 命令在监控和管理栈任务方面的灵活性。