Docker ps 命令(实战指南)

Docker ps 命令:查看运行中的容器,像查监控一样轻松

在你开始使用 Docker 的时候,最常遇到的一个问题就是:“我到底跑了多少个容器?它们现在在干嘛?” 这时候,docker ps 命令就是你最可靠的“望远镜”。它就像你手机里的任务管理器,能立刻告诉你当前系统里正在运行的进程有哪些。

想象一下,你的电脑就像是一个繁忙的餐厅厨房。你开了好几个灶台(容器),每个灶台在炒不同的菜(运行不同的服务)。如果厨房里没有一个“总览图”,你根本不知道哪个锅在冒烟、哪个菜快好了。docker ps 就是这个“总览图”,它让你一眼看清所有正在运行的容器状态。


基础用法:快速查看正在运行的容器

最简单的用法是直接输入:

docker ps

执行后你会看到类似下面的输出:

CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                  NAMES
a1b2c3d4e5f6   nginx:latest   "nginx -g 'daemon off"   2 minutes ago     Up 2 minutes   0.0.0.0:8080->80/tcp   web-server

这个命令会列出所有正在运行的容器,仅显示活跃状态的。它默认只显示最近创建的、正在工作的容器,不会把那些已经停止的“僵尸容器”列出来。

💡 小贴士:docker psdocker container ls 的简写,两者完全等价。但前者更常用,也更顺口。


详细信息:带上 -a 参数查看所有容器

你有没有遇到过“明明删过容器,怎么还看到它在列表里”?那可能是因为你只查了“运行中”的容器,而那些已经停止的容器默认不会显示。

这时候就需要用 -a 参数了:

docker ps -a

这个命令会列出所有容器,包括运行中、停止的、甚至已经删除但未清理的。输出会多出一列 STATUS,比如:

  • Up 5 minutes:运行中
  • Exited (0):正常退出
  • Exited (137):被终止(通常是内存超限)

这就像你打开任务管理器,看到“正在运行”和“已结束”的程序都列出来,方便你做清理和排查。


格式化输出:用 --format 自定义显示内容

默认的表格输出虽然清晰,但有时候太“啰嗦”。如果你只想看容器 ID 和名称,可以使用 --format 参数:

docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"

输出示例:

CONTAINER ID   NAMES           STATUS
a1b2c3d4e5f6   web-server      Up 5 minutes
f6e5d4c3b2a1   db-container    Exited (0)

这个功能特别适合写脚本时使用。比如你想在 CI/CD 流程中判断某个容器是否在运行,就可以用这种格式提取关键字段。

📌 提示:{{.ID}}{{.Names}}{{.Status}} 是 Docker 的模板语法,你可以在 --format 中自由组合,实现个性化的输出。


按条件筛选:用 --filter 过滤容器

当你的机器上跑着几十个容器时,全列表根本没法看。这时候 --filter 就派上用场了。

比如你想只看名称包含 web 的容器:

docker ps --filter "name=web"

或者只看状态为 running 的:

docker ps --filter "status=running"

更高级的用法,可以组合多个过滤条件。比如只查看名字是 app 且状态为运行的容器:

docker ps --filter "name=app" --filter "status=running"

这就像你在微信聊天列表里搜索“项目”两个字,立刻把相关对话找出来,效率高得多。


查看端口映射:理解容器与宿主机的通信

容器运行时,经常要暴露端口给外部访问,比如运行一个 Web 服务。docker psPORTS 列就告诉你这些端口映射关系。

比如:

0.0.0.0:8080->80/tcp

这表示:宿主机的 8080 端口映射到了容器的 80 端口。

⚠️ 注意:0.0.0.0 表示绑定到所有网络接口,意味着外部网络也可以访问。如果你只希望本地访问,可以用 127.0.0.1:8080->80/tcp

这个信息对排查“为什么网页打不开”特别有用。比如你发现 docker ps 显示端口映射了,但浏览器访问失败,那就要检查防火墙、宿主机网络配置,甚至容器内部服务是否真的在监听。


实战案例:用 Docker ps 诊断服务异常

假设你部署了一个 Node.js 应用,启动后发现无法访问。这时你可以按以下步骤排查:

  1. 先看容器是否在运行:
docker ps

如果没看到你的应用容器,说明它可能已经退出。

  1. 查看所有容器,包括停止的:
docker ps -a

找到你的容器,观察它的 STATUS 列。如果是 Exited (1),说明程序启动失败。

  1. 查看容器日志:
docker logs <容器ID或名称>

日志里可能有报错信息,比如 Error: listen EADDRINUSE: address already in use,说明端口被占用了。

  1. 再次运行 docker ps,检查端口映射是否正确:
docker ps --format "table {{.Names}}\t{{.Ports}}"

如果发现 PORTS 列显示 0.0.0.0:3000->3000/tcp,但你实际访问的是 8080,那说明配置有误。

通过这套组合拳,你就能快速定位问题根源。


高级技巧:结合 shell 脚本自动化管理

docker ps 不仅适合手动排查,还能写进脚本,实现自动化运维。

比如写一个脚本,每天凌晨自动清理停止的容器:

#!/bin/bash

echo "正在清理停止的容器..."

stopped_containers=$(docker ps -a --filter "status=exited" --format "{{.ID}}")

if [ -n "$stopped_containers" ]; then
  echo "发现 $stopped_containers 个停止的容器,正在删除..."
  docker rm $stopped_containers
else
  echo "没有发现停止的容器。"
fi

这个脚本中,docker ps -a --filter "status=exited" 就是核心,它精准筛选出所有退出的容器。


常见问题与解决

Q:为什么 docker ps 显示的容器时间是“几天前”?

A:CREATED 列显示的是容器创建时间,不是运行时间。即使容器已经停止,创建时间也不会变。如果容器长期未使用,建议定期清理。

Q:docker ps 没有显示我刚启动的容器?

A:可能是容器启动失败了。先用 docker ps -a 查看状态,再用 docker logs <容器名> 查看日志,定位问题。

Q:能不能只显示某个镜像的容器?

A:可以!用 --filter "ancestor=nginx",例如:

docker ps --filter "ancestor=nginx:latest"

这会列出所有基于 nginx:latest 镜像创建的容器。


总结:掌握 Docker ps 命令,让容器管理不再迷路

docker ps 命令是 Docker 生态中最基础也最重要的命令之一。它不只是一个“查看工具”,更是你排查问题、管理容器、编写自动化脚本的起点。

从最简单的 docker ps,到带 -a 查看全部,再到 --filter 精准筛选,--format 自定义输出,它能适应各种使用场景。

记住:容器是轻量的,但管理它们不能轻率。 每一次 docker ps 的调用,都是一次对系统状态的确认。

当你能熟练使用 docker ps,你就离“Docker 真正使用者”不远了。别再靠“猜”容器状态,用命令说话,让每一次部署都清晰可见。