docker top 是什么
docker top 从宿主机视角列出容器里的进程,给出的 PID 是宿主命名空间下的进程号,可以和宿主的 ps、top 输出直接对齐。它由守护进程在宿主侧取进程信息,因此不依赖镜像里装没装 ps,极简镜像(scratch、distroless)也能用。
基本信息
| 用途 | 列出容器内进程,看宿主 PID 视角 |
|---|---|
| 语法 | docker top CONTAINER [宿主 ps 参数] |
| 底层 | 守护进程在宿主侧读取进程信息,镜像里没有 ps 也能用 |
| 对照命令 | docker inspect -f '{{.State.Pid}}' 取主进程的宿主 PID |
| 常用参数 | -o pid,ppid,stat,cmd 指定列,或直接跟 aux |
典型使用场景
- 确认容器真正在跑什么进程:镜像 ENTRYPOINT 被编排参数覆盖后,实际命令与文档不一致
- 排查多进程容器的僵尸子进程:STAT 列出现 Z 说明父进程没回收
- 对齐宿主监控数据:拿到宿主 PID 后去 top、pidstat 里看它占了多少资源
- 容器占满 CPU 或内存时先定位到具体进程,再决定进容器调试还是直接重启
- 确认 --init 是否生效:主进程应当变成 docker-init,而不是应用本身
示例
示例
docker top web # 默认列出 pid、用户、启动时间、命令
docker top web -o pid,ppid,stat,cmd # 指定列,看清父子关系
docker top web aux # 按整机格式列出,含 CPU 与内存列
docker inspect -f 'PID={{.State.Pid}}' web # 主进程在宿主上的 PID输出列怎么读
| 列 | 含义 | 注意点 |
|---|---|---|
| PID | 宿主命名空间下的进程号 | 与容器内 ps 看到的编号不同 |
| PPID | 父进程的宿主 PID | 容器主进程的父进程通常是宿主上的 shim |
| STAT | 进程状态 | 出现 Z 是僵尸进程,根因在父进程未回收 |
| COMMAND | 完整命令行 | 可能带 entrypoint 包装,与镜像的 Cmd 字段不一致 |
| TIME/STIME | 累计 CPU 时间与启动时刻 | 对照重启时间判断是不是刚被拉起 |
容器里没有 ps 也能用 docker top,它在宿主侧取进程信息;反过来,在容器里要自己看进程就得先装 procps 之类的工具。
跟在容器名后面的参数会透传给宿主的 ps。procps 版本不同,支持的选项也不同,复杂排序统计建议拿到宿主终端里做。