如何使用 docker compose ps 命令列出容器

DockerDockerBeginner
立即练习

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

简介

在本实验中,你将学习如何高效使用 docker compose ps 命令来列出由 Docker Compose 管理的容器。首先你需要安装 Docker Compose,并通过 docker-compose.yml 文件搭建一个简单项目。

完成基础配置后,你将探索以下内容:如何仅列出运行中的容器、在输出结果中包含已停止的容器、根据容器状态进行筛选,以及将输出格式化为 JSON 以便于解析和集成。通过这个动手实践,你将掌握高效监控和管理 Docker Compose 服务的核心技能。


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/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/ps -.-> lab-555086{{"如何使用 docker compose ps 命令列出容器"}} docker/pull -.-> lab-555086{{"如何使用 docker compose ps 命令列出容器"}} end

使用 docker compose ps 列出运行中的容器

在本步骤中,你将学习如何使用 docker compose ps 命令列出运行中的容器。在使用 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

该命令会下载适用于你系统架构的 Docker Compose 二进制文件,并保存到 /usr/local/bin/docker-compose

接着,我们需要给二进制文件添加可执行权限:

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

现在,让我们通过检查版本来验证安装:

docker-compose --version

你应该能在输出中看到已安装的 Docker Compose 版本。

为了演示 docker compose ps,我们需要一个 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 infinity

这个 docker-compose.yml 文件定义了两个服务:使用 nginx 镜像的 web 服务和使用 alpine 镜像的 app 服务。web 服务将主机的 80 端口映射到容器的 80 端口,app 服务运行 sleep infinity 命令来保持容器运行。

保存文件并退出编辑器(按 Ctrl+X,输入 Y,然后按 Enter)。

现在,让我们拉取所需的镜像:

docker pull nginx:latest
docker pull alpine:latest

这些命令会从 Docker Hub 下载 nginx:latestalpine:latest 镜像。

接着,启动 docker-compose.yml 文件中定义的服务。请确保你位于 ~/project 目录下:

cd ~/project
docker-compose up -d

docker-compose up -d 命令会构建、创建、启动并附加到服务的容器。-d 标志表示在后台运行容器。

现在容器已经运行起来了,我们可以使用 docker compose ps 来列出它们:

docker-compose ps

该命令会列出 docker-compose.yml 文件中定义的运行中容器。你应该能看到类似以下的输出,显示容器名称、命令、状态和端口信息:

NAME                COMMAND             SERVICE             STATUS              PORTS
project-app-1       "sleep infinity"    app                 running
project-web-1       "/docker-entrypoint.sh nginx -g 'daemon off;'"   web                 running             0.0.0.0:80->80/tcp

输出显示 project-app-1project-web-1 容器正在运行。NAME 通常由项目名称(目录名)、服务名称和一个数字组成。

列出所有容器(包括已停止的)

在上一步中,我们使用 docker compose ps 仅列出了运行中的容器。有时你可能需要查看所有容器,包括那些已经停止或退出的容器。

要列出所有容器(包括已停止的),可以在 docker compose ps 命令后添加 -a 标志。

首先,让我们停止一个正在运行的容器来观察 -a 标志的效果。我们将停止 app 服务。请确保你位于 ~/project 目录下:

cd ~/project
docker-compose stop app

该命令会停止 app 服务的容器。容器将不再运行,但仍然存在。

现在,让我们再次使用 docker compose ps 列出容器:

docker-compose ps

你应该只能看到 web 容器被列为运行状态。app 容器不会显示,因为它已经停止:

NAME                COMMAND             SERVICE             STATUS              PORTS
project-web-1       "/docker-entrypoint.sh nginx -g 'daemon off;'"   web                 running             0.0.0.0:80->80/tcp

现在,让我们使用 -a 标志来列出所有容器(包括已停止的):

docker-compose ps -a

该命令会显示 docker-compose.yml 文件中定义的所有容器,无论其当前状态如何:

NAME                COMMAND             SERVICE             STATUS              PORTS
project-app-1       "sleep infinity"    app                 exited (0)
project-web-1       "/docker-entrypoint.sh nginx -g 'daemon off;'"   web                 running             0.0.0.0:80->80/tcp

可以看到 project-app-1project-web-1 容器都被列出。project-app-1STATUS 列显示为 exited,表示它已停止。

使用 docker compose ps -a 可以方便地查看所有服务的状态,即使它们当前并未运行。

按状态筛选容器

在前面的步骤中,我们学习了如何列出运行中的容器和所有容器。有时你可能需要根据容器状态来筛选列表。

docker compose ps 命令允许你使用 --filter 标志来筛选输出。你可以根据多种条件进行筛选,包括容器状态。

常见的容器状态包括:

  • created:容器已创建但未启动
  • restarting:容器正在重启中
  • running:容器正在运行
  • removing:容器正在被移除
  • paused:容器已暂停
  • exited:容器已停止
  • dead:容器已终止

让我们筛选只显示运行中的容器。虽然默认情况下 docker compose ps 就会显示运行中的容器,但我们也可以通过过滤器实现同样的效果。请确保你位于 ~/project 目录下:

cd ~/project
docker-compose ps --filter status=running

该命令将只列出状态为 running 的容器。你应该只能看到 web 容器被列出:

NAME                COMMAND             SERVICE             STATUS              PORTS
project-web-1       "/docker-entrypoint.sh nginx -g 'daemon off;'"   web                 running             0.0.0.0:80->80/tcp

现在,让我们筛选只显示已停止的容器。记得我们在上一步停止了 app 容器,所以它的状态应该是 exited

docker-compose ps --filter status=exited

该命令将只列出状态为 exited 的容器。你应该只能看到 app 容器被列出:

NAME                COMMAND             SERVICE             STATUS              PORTS
project-app-1       "sleep infinity"    app                 exited (0)

你还可以通过多次使用 --filter 标志来按多个状态筛选。例如,列出正在运行或已停止的容器:

docker-compose ps --filter status=running --filter status=exited

该命令将同时列出 webapp 容器:

NAME                COMMAND             SERVICE             STATUS              PORTS
project-app-1       "sleep infinity"    app                 exited (0)
project-web-1       "/docker-entrypoint.sh nginx -g 'daemon off;'"   web                 running             0.0.0.0:80->80/tcp

按状态筛选是快速查找特定状态容器的强大方法,对于调试和管理服务非常有用。

以 JSON 格式输出

在前面的步骤中,我们使用 docker compose ps 列出并筛选了容器。默认情况下,输出是以人类可读的表格形式呈现的。但对于脚本编写或与其他工具集成时,你可能需要结构化的 JSON 格式输出。

docker compose ps 命令允许你使用 --format 标志来指定输出格式,包括 json 格式。

让我们列出所有容器(运行中和已停止的)并以 JSON 格式输出。请确保你位于 ~/project 目录下:

cd ~/project
docker-compose ps -a --format json

该命令将以 JSON 格式输出所有容器的信息。输出结果是一个 JSON 数组,其中每个元素代表一个容器及其详细信息:

[
  {
    "ID": "...",
    "Name": "project-app-1",
    "Image": "alpine:latest",
    "Command": "sleep infinity",
    "Project": "project",
    "Service": "app",
    "Created": "...",
    "State": "exited",
    "Status": "Exited (0) ...",
    "Health": "",
    "ExitCode": 0,
    "Publishers": []
  },
  {
    "ID": "...",
    "Name": "project-web-1",
    "Image": "nginx:latest",
    "Command": "/docker-entrypoint.sh nginx -g 'daemon off;'",
    "Project": "project",
    "Service": "web",
    "Created": "...",
    "State": "running",
    "Status": "Up ...",
    "Health": "",
    "ExitCode": null,
    "Publishers": [
      {
        "URL": "0.0.0.0",
        "TargetPort": 80,
        "PublishedPort": 80,
        "Protocol": "tcp"
      }
    ]
  }
]

JSON 输出提供了容器信息的结构化表示,便于程序化解析和处理。每个容器都表示为一个 JSON 对象,包含 IDNameImageStateStatus 等字段。

当需要为自动化或报告目的提取特定容器信息时,使用 --format json 标志特别有用。

最后,让我们清理在本实验中创建的容器:

docker-compose down

该命令会停止并移除由 docker-compose up 创建的容器、网络和卷。

总结

在本实验中,你学习了如何使用 docker compose ps 命令来列出由 Docker Compose 管理的容器。你首先安装并验证了 Docker Compose 的安装。接着,你创建了一个简单的 docker-compose.yml 文件,定义了两个服务,并拉取了所需的镜像。你使用 docker-compose up -d 以后台模式启动了这些服务。

随后,你探索了 docker compose ps 命令来列出运行中的容器。你学会了如何使用 -a 标志在输出中包含已停止的容器,通过 --filter status=<status> 选项按状态筛选容器,以及使用 --format json 选项将输出格式化为 JSON。最后,你通过 docker-compose down 命令停止并移除了创建的服务,完成了资源清理。