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

DockerBeginner
立即练习

介绍

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

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

部署示例栈

在这一步中,你将学习如何使用 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 命令在监控和管理栈任务方面的灵活性。