docker ps 一眼看懂:容器状态速查

docker ps 输出那一堆列到底在说什么?CONTAINER ID、STATUS、PORTS 一眼看懂,外加 inspect、top、stats、rename 等配套命令,查容器状态一篇就够。

我是小够,只推够用的 VPS。

docker ps 是你和容器打交道最多的命令,但它的输出对新手不太友好。今天把它掰开,一列一列讲清楚,再配几个配套命令,查容器状态一篇就够。

先跑一个看看

docker ps

典型输出:

CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS        PORTS                  NAMES
a1b2c3d4e5f6   nginx:alpine   "/docker-entrypoint.…"   2 hours ago    Up 2 hours    0.0.0.0:8080->80/tcp   web

每一列是什么意思

  • CONTAINER ID:容器身份证,前 12 位,敲命令时写前 3-4 位一般就能唯一匹配,偷懒必备。比如 docker logs a1b2 就行,不用全敲。
  • IMAGE:这个容器从哪个镜像来的,带 tag,一眼看出版本。
  • COMMAND:容器启动时执行的命令,一般不用管,但排错时能确认"起的是不是我想的那个进程"。
  • CREATED:容器创建了多久。刚 up 的项目,这里应该是几分钟前;如果显示几天前,说明是很久没重建的老容器。
  • STATUS:重点看这列,状态全解:
    • Up 2 hours:正常运行 2 小时。
    • Up 2 hours (healthy):运行中且健康检查通过(配了 healthcheck 才有)。
    • Up 2 hours (unhealthy):运行中但健康检查失败,应用可能有问题,赶紧看日志。
    • Exited (0):正常退出,比如一次性任务跑完了,别当故障。
    • Exited (1):报错退出,看日志找原因。
    • Exited (137):被 OOM kill,内存爆了。
    • Restarting (1) 5 seconds ago:在反复重启——基本就是配置有问题,看日志,括号里是退出码。
    • Created:建好了但没启动,docker start 启动它。
    • Paused:被暂停了,docker unpause 恢复。
    • Dead:僵死状态,极少见,重启 Docker 守护进程一般能解决。
  • PORTS:0.0.0.0:8080->80/tcp 表示主机的 8080 映射到容器的 80。如果这列是空的,说明没做端口映射,外面访问不到。如果是 127.0.0.1:8080->80/tcp,表示只监听本机,外面也访问不到——排错那篇讲过这个坑。
  • NAMES:容器名,docker compose 起的一般是"目录名-服务名-序号",比如 wordpress-web-1。

三个变体,记住就够

docker ps -a        # 看所有容器,包括停掉的。找"我刚才跑的那个去哪了"用它
docker ps -q        # 只输出 ID,适合接管道批量操作,比如 docker stop $(docker ps -q)
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"  # 自定义列,清爽
docker ps -s        # 多一列 SIZE,看可写层大小(可写层那篇讲过)

配套命令:状态之外的信息

docker stats              # 实时看每个容器的 CPU、内存占用,排查"谁把机器吃满了"
docker stats --no-stream  # 只看一眼,不持续刷新
docker top 容器名          # 看容器里跑的进程
docker port 容器名         # 看端口映射
docker inspect 容器名      # 看完整配置(JSON,信息最全)
docker inspect -f '{{.State.Status}}' 容器名  # 只取状态,写脚本用
docker rename 旧名 新名    # 给容器改名

docker inspect 输出很长,配合 -f 取字段是常用技巧,写监控脚本时用得上。比如定时检查容器是不是 healthy:

docker inspect -f '{{.State.Health.Status}}' 容器名

排错小技巧

容器 Up 了但网站打不开?按这个顺序查:docker ps 看 PORTS 映射对不对 → docker logs 容器名 看应用报错 → curl localhost:端口 在本机试。八成问题出在这三步里,剩下的两成看本月排错手册那篇。

还有个习惯:出问题先 docker ps -a 看所有容器,别只看运行中的。刚退出的容器状态里藏着退出码,那是第一线索。