docker top 是最轻量可靠的查看容器进程方式,原生无侵入,支持字段定制;结合 docker stats 可快速定位资源异常进程,批量巡检与 nsenter 进阶监控进一步提升运维效率。
直接用 docker top 查运行中容器的进程,不用进容器、不装工具、也不依赖镜像里有没有 top 或 ps——这是最轻量、最可靠的方式。
它本质是读取容器 PID namespace 下的 /proc 信息,不执行任何容器内命令,零侵入。
PID(容器内 PID)、USER、TIME、CMD(启动命令)-eo 可按需筛选字段,语法兼容 ps:docker top myapp_web_1 -eo pid,pcpu,comm,args
docker top myapp_db_1 -eo pid,ppid,comm,args
docker top myapp_app_1 -eo pid,comm,args | grep -E "(python|java)"
当 docker stats 显示某容器 CPU 或内存飙升时,立刻同步下钻:
docker stats myapp_cache_1 --no-stream
docker top myapp_cache_1 -eo pid,pcpu,pmem,comm,args对比发现某个 node 进程 pcpu 达 82%,且 args 显示它正执行未优化的 JSON 解析循环——问题定位完成。
容器名通常是 项目名_服务名_序号(如 myapp_api_1),先确认:
docker ps --format "table {{.Names}}t{{.Status}}t{{.Ports}}"
再用脚本批量统计或轮询:
for c in $(docker ps --filter "name=myapp_" --format "{{.Names}}"); do echo "== $c =="; docker top "$c" 2>/dev/null | wc -l; done
watch -n 2 'docker top myapp_web_1 -eo pid,pcpu,comm,args'
若需更底层视角(比如查看所有线程、僵尸进程、或验证命名空间隔离是否生效),可用 nsenter:
CONTAINER_PID=$(docker inspect -f '{{.State.Pid}}' myapp_web_1)
ps:nsenter -t $CONTAINER_PID -p ps auxf
watch -n 1 'nsenter -t $CONTAINER_PID -p ps aux --sort=-%cpu'该方式完全不触达容器文件系统,不留痕迹,适合审计与高安全要求场景。
不复杂但容易忽略