docker compose ps 命令(快速上手)

什么是 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:容器当前状态,常见值包括 runningexitedrestarting
  • 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 成为你开发流程中的“标配”。