无侵入提取容器内业务进程信息的核心是利用命名空间映射,通过 docker inspect 获取 pid,nsenter 进入 pid 命名空间执行 ps;结合 /proc/$pid/root 读取 cmdline、cwd、environ;用 docker inspect 检查 privileged、pidmode、usernsmode 确认隔离状态;最后用 watch 实现持续监控。
直接在宿主机上获取容器内业务进程信息,无需进容器、不装工具、不留痕迹——这是无侵入提取的核心目标。关键在于利用容器与宿主机之间的命名空间映射关系,绕过容器边界,从外部“透视”内部进程。
用 nsenter + ps 快速抓取进程快照
这是最轻量、最通用的方式。容器在宿主机上一定对应一个主进程(PID),通过它就能进入其 PID 命名空间,看到全部进程树:
- 先查 PID:
docker inspect -f '{{.State.Pid}}' myapp - 再进命名空间查进程:
nsenter -t $PID -p ps auxf | grep -E "(java|node|python|dotnet)" - 加
--sort=-%cpu或--sort=-%mem可快速定位高负载业务进程
通过 /proc/$PID/root 直接读取进程运行时上下文
每个容器的 /proc/$PID/root 是指向其根文件系统的符号链接。这意味着你可以直接从宿主机读取容器内进程打开的文件、环境变量甚至命令行参数:
- 查看某进程启动命令:
cat /proc/$PID/root/proc/$(pgrep -f "my-service")/cmdline | tr '\0' ' ' - 检查进程当前工作目录:
readlink /proc/$PID/root/proc/$(pgrep -f "my-service")/cwd - 读取进程环境变量(需有权限):
strings /proc/$PID/root/proc/$(pgrep -f "my-service")/environ
结合 docker inspect 提取进程归属与安全上下文
光看进程还不够,得确认它是否真正属于业务容器、有没有逃逸风险:
- 查是否特权模式:
docker inspect -f '{{.HostConfig.Privileged}}' myapp—— 若为 true,进程隔离已失效 - 查是否共享命名空间:
docker inspect -f '{{.HostConfig.PidMode}} {{.HostConfig.IpcMode}}' myapp—— host 或 container:xxx 表示未隔离 - 查用户命名空间启用状态:
docker inspect -f '{{.HostConfig.UsernsMode}}' myapp—— 空值表示未启用 user namespace
用 watch 封装成持续观察命令
对关键业务容器,可做成简易监控脚本,每秒刷新一次核心进程状态:
watch -n 1 'PID=$(docker inspect -f "{{.State.Pid}}" myapp); nsenter -t $PID -p ps aux --sort=-%cpu | head -10'- 配合
grep过滤特定关键字,如grep "gunicorn\|uwsgi\|nginx",聚焦 Web 服务主进程 - 输出中重点关注 UID、PPID、%CPU、%MEM 和 COMMAND 列,判断是否异常子进程或僵尸进程











