首页/云/云与容器速查/docker top 查看容器进程
容器与 Docker106 条

docker top 查看容器进程

显示容器内运行的进程列表(ps 视角):确认主进程、worker 数量、僵尸进程;比 exec ps 更快且不进入容器。

云与容器速查云更新于 2026-10-13

从宿主机视角看容器进程

docker top 在宿主机上执行 ps 并按容器过滤,输出容器内运行的进程列表。它的价值在于不进容器、不依赖容器内存在 ps 或 shell,就能确认容器里到底在跑什么:PID 1 是谁、worker 有几个、有没有僵尸进程。相比之下 docker exec ps 需要容器内有可用命令,distroless 或 scratch 镜像上根本走不通。

基本信息

语法docker top CONTAINER [ps 选项]
依赖容器必须处于运行状态,宿主机需要存在 ps 命令
默认视图等价于宿主机的 ps -ef 输出,列宽受 ps 默认设置影响
视角差异输出的 PID 是宿主机命名空间下的进程号,不是容器内 PID
权限具备 Docker 访问权限的用户即可;只看本容器进程,不需要宿主 root

典型使用场景

  • 确认 PID 1 是什么:应用直接作为入口,还是被 shell 或启动脚本包了一层
  • 排查僵尸进程:确认 PID 1 有没有回收子进程的能力
  • 核对 worker 数量与配置是否一致,例如 Gunicorn/Node 集群模式的实际并发
  • 容器内命令行为异常时,看实际启动命令与参数是否被覆盖
  • 宿主整体负载高时,把高 CPU 进程对应到具体的容器

常用命令组合

常用命令组合
docker top myapp                        # 默认 ps -ef 视图
docker top myapp aux                    # 带 CPU 与内存列
docker top myapp -o pid,ppid,stat,cmd   # 指定列,便于 grep 僵尸进程
docker inspect -f '{{.State.Pid}}' myapp   # 取容器主进程的宿主 PID
nsenter -t $(docker inspect -f '{{.State.Pid}}' myapp) -p ps -ef   # 容器内视角
ps -o pid,ppid,stat,cmd --ppid $(docker inspect -f '{{.State.Pid}}' myapp)  # 宿主视角看子进程

输出逐列读法

列含义异常表现
PID宿主机命名空间下的进程号与容器内 PID 不同,误用于容器内 kill 会失败或杀错
PPID父进程号大量子进程 PPID 为 1 且状态为 Z,说明 PID 1 未回收子进程
STAT进程状态长期 D 状态说明卡在 IO,Z 状态堆积说明僵尸未清理
CMD实际启动命令与 Dockerfile 的 ENTRYPOINT/CMD 不一致,说明被覆盖或被包装
TIME/CPU累计 CPU 时间与占用单进程长期接近满载,需先查该进程再看容器限制
PID 差异来自 PID 命名空间:容器内的 PID 1 在宿主机上是另一个较大的进程号。要在容器视角下操作,用 nsenter 指定命名空间,或直接用 docker exec 执行命令。
出现 defunct 僵尸进程说明 PID 1 没有回收子进程,常见于入口脚本没有用 exec 启动应用,或自身未处理 SIGCHLD。长期堆积会耗尽可用 PID,导致容器内无法再 fork 新进程。解法是让入口脚本 exec 应用进程,或给容器加 --init。

易错点

  • 把 docker top 输出的宿主 PID 当作容器内 PID 去操作,杀不掉目标进程甚至误杀同宿主上的其他进程
  • 只看主进程不看子进程:worker 崩溃重启、入口脚本拉起的子进程异常这类问题会被漏掉,需配合 --ppid 过滤查看
  • 在 distroless 或 scratch 镜像上只用 docker exec ps 排查,容器里没有 ps 就直接卡住,应先考虑 docker top
  • 僵尸进程堆积放任不管,PID 资源耗尽后容器内无法启动新进程,表现为应用报无法 fork

数据来源与参考

  • Docker Docs:docker top

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌