什么是 Docker Compose 与 docker compose ps 命令
在现代软件开发中,我们经常需要同时运行多个服务,比如前端应用、后端 API、数据库、缓存服务等。如果手动一个个启动这些服务,不仅效率低,还容易出错。这时候,Docker Compose 就派上用场了。
Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。你只需编写一个 docker-compose.yml 文件,就能描述整个应用的架构。而 docker compose ps 命令,就是用来查看当前正在运行的容器状态的“眼睛”。
想象一下,你的项目就像一个小型城市:数据库是供水系统,后端是交通调度中心,前端是居民区的窗户。docker compose ps 命令就是站在城市上空俯瞰所有建筑(容器)是否正常运转的监控台。它能告诉你哪些在运行、哪些失败了、端口映射情况如何,甚至能帮你快速定位问题。
这个命令是 Docker Compose 最常用、最基础的调试命令之一。无论你是初学者还是资深开发者,掌握它,就等于掌握了一把打开多服务应用诊断之门的钥匙。
查看运行中的容器状态
当你运行 docker compose up 后,所有服务都会启动。但你如何确认它们真的在跑?这就是 docker compose ps 命令的用武之地。
直接在项目根目录执行:
docker compose ps
执行后你会看到类似这样的输出:
NAME COMMAND SERVICE STATUS PORTS
app-web "nginx -g 'daemon…" web running 0.0.0.0:8080->80/tcp
app-api "python app.py" api running 0.0.0.0:5000->5000/tcp
app-db "docker-entrypoint…" db running 0.0.0.0:3306->3306/tcp
每一列的含义如下:
- NAME:容器的名称,由服务名和序号组成(如
app-web) - COMMAND:容器启动时执行的命令
- SERVICE:服务名,对应
docker-compose.yml中的 service 名称 - STATUS:容器当前状态,常见值包括
running、exited、restarting - PORTS:端口映射情况,如
8080->80表示主机 8080 端口映射到容器 80 端口
这个命令就像你打开任务管理器,查看哪些程序正在运行。如果你发现某个服务的 STATUS 是 exited,说明它启动失败了,你需要进一步排查日志。
详细查看容器信息
有时候你不仅想知道“有没有在跑”,还想了解更详细的信息,比如容器 ID、创建时间、网络模式等。这时候可以加上 -v 参数(verbose):
docker compose ps -v
输出会变得非常详细,例如:
Name: app-web
Command: nginx -g 'daemon off;'
Created: 2025-04-05 10:30:15 UTC
Status: Up 3 hours
Ports: 0.0.0.0:8080->80/tcp
Networks: app_default
Image: nginx:alpine
Mounts: /app:/usr/share/nginx/html
这里你可以看到:
- Created:容器创建的时间
- Status:运行了多久
- Networks:容器连接的网络
- Image:使用的镜像
- Mounts:挂载的卷
这些信息对排查问题非常有帮助。比如你发现某个服务访问不到,可以检查它的网络是否正确,挂载路径是否正确,端口是否被占用。
只查看特定服务的容器
如果你的项目有多个服务,但你只关心某个服务(比如后端 API),可以使用 --services 参数来列出所有服务名,或者用 --filter 筛选。
比如,只列出 api 服务的容器:
docker compose ps --filter service=api
输出:
NAME COMMAND SERVICE STATUS PORTS
app-api "python app.py" api running 0.0.0.0:5000->5000/tcp
这就像你在一堆文件中只找某个文件夹里的内容。当你项目复杂时,这个功能能极大提高效率。
你也可以通过 --filter status=running 只看正在运行的容器:
docker compose ps --filter status=running
这个组合在脚本中非常有用——你可以判断某个服务是否已经准备好,再执行下一步操作。
查看所有容器(包括已停止的)
默认情况下,docker compose ps 只显示正在运行的容器。但如果你想知道历史状态,比如某个服务曾启动失败,可以使用 -a 参数(all):
docker compose ps -a
输出会包含已停止的容器,例如:
NAME COMMAND SERVICE STATUS PORTS
app-web "nginx ..." web running 0.0.0.0:8080->80/tcp
app-api "python ..." api exited (1) 3 hours ago
app-db "mysqld ..." db running 0.0.0.0:3306->3306/tcp
注意 exited (1) 表示服务退出时返回了非零状态码,说明有错误。你可以结合 docker compose logs api 查看具体错误日志。
这个功能在调试时特别重要。比如你改了配置文件,重启后服务没起来,ps -a 能帮你第一时间发现它“退出”了,而不是“没启动”。
实战案例:快速排查启动失败的服务
我们来模拟一个真实场景。假设你有一个项目,结构如下:
project/
├── docker-compose.yml
├── app/
│ └── app.py
└── nginx/
└── default.conf
docker-compose.yml 内容如下:
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./nginx:/etc/nginx/conf.d
depends_on:
- api
api:
build:
context: ./app
ports:
- "5000:5000"
command: python app.py
运行 docker compose up 后,发现访问 http://localhost:8080 报错。这时候,你立刻执行:
docker compose ps -a
输出:
NAME COMMAND SERVICE STATUS PORTS
app-web "nginx ..." web running 0.0.0.0:8080->80/tcp
app-api "python app.py" api exited (1) 2 minutes ago
发现 api 服务退出了。于是你查看日志:
docker compose logs api
日志显示:
ERROR: Could not connect to database at localhost:3306
原来是因为 api 服务启动时试图连接数据库,但数据库服务没有启动。你检查 docker-compose.yml,发现没有定义数据库服务。问题找到了!
修正后加上 db 服务,重新运行,一切正常。
这个案例说明:docker compose ps 是你排查问题的“第一道防线”。它不只告诉你“有没有在跑”,还告诉你“跑没跑成”。
高级技巧:结合脚本使用
在 CI/CD 流水线中,你可能需要判断服务是否已启动。这时可以配合 docker compose ps 写脚本。
比如判断 api 服务是否运行:
if docker compose ps --filter service=api --filter status=running --format="{{.Status}}" | grep -q "running"; then
echo "API 服务已就绪"
else
echo "API 服务未启动,等待中..."
exit 1
fi
这个脚本可以放在启动后自动检测,避免后续步骤因服务未就绪而失败。
你还可以用 --format 自定义输出格式,比如只输出服务名:
docker compose ps --format "{{.Name}} {{.Status}}"
输出:
app-web running
app-api exited
这种灵活性让 docker compose ps 不仅是查看工具,更是自动化流程的有力助手。
总结与建议
docker compose ps 命令虽然简单,却是开发中不可或缺的利器。它像一个“容器状态仪表盘”,让你随时掌握整个应用的运行情况。
掌握它,你就能:
- 快速确认服务是否启动成功
- 定位退出的服务,配合日志排查问题
- 在脚本中自动化判断服务状态
- 管理复杂的多服务项目
无论你是刚接触 Docker,还是已有几年经验,这个命令都值得你每天用一用。建议养成习惯:每次运行 up 后,先执行 ps 看一眼,确认一切正常再继续下一步。
记住,好的开发习惯,往往始于一个简单的命令。从今天开始,让 docker compose ps 成为你开发流程中的“标配”。