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 ps是docker 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 ps 的 PORTS 列就告诉你这些端口映射关系。
比如:
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 应用,启动后发现无法访问。这时你可以按以下步骤排查:
- 先看容器是否在运行:
docker ps
如果没看到你的应用容器,说明它可能已经退出。
- 查看所有容器,包括停止的:
docker ps -a
找到你的容器,观察它的 STATUS 列。如果是 Exited (1),说明程序启动失败。
- 查看容器日志:
docker logs <容器ID或名称>
日志里可能有报错信息,比如 Error: listen EADDRINUSE: address already in use,说明端口被占用了。
- 再次运行
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 真正使用者”不远了。别再靠“猜”容器状态,用命令说话,让每一次部署都清晰可见。