介绍
在本实验中,你将学习如何高效使用 docker compose ps 命令来列出由 Docker Compose 管理的容器。首先你需要安装 Docker Compose,并通过 docker-compose.yml 文件搭建一个简单项目。
完成基础配置后,你将探索以下内容:如何仅列出运行中的容器、在输出结果中包含已停止的容器、根据容器状态进行筛选,以及将输出格式化为 JSON 以便于解析和集成。通过这个动手实践,你将掌握高效监控和管理 Docker Compose 服务的核心技能。
使用 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:latest 和 alpine: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-1 和 project-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-1 和 project-web-1 容器都被列出。project-app-1 的 STATUS 列显示为 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
该命令将同时列出 web 和 app 容器:
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 对象,包含 ID、Name、Image、State、Status 等字段。
当需要为自动化或报告目的提取特定容器信息时,使用 --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 命令停止并移除了创建的服务,完成了资源清理。



