--pid=host是最简有效的配置方式,使容器复用宿主机PID命名空间,直接查看全部进程;docker-compose中需写为pid: "host"(加引号防YAML解析错误);适用于调试监控类可信容器,禁用于生产业务容器。
直接用 --pid=host 启动容器,就能让容器内看到宿主机全部进程,包括其他容器和系统服务。这是最简、最有效的配置方式,无需额外挂载或权限调整。
启动时启用 host PID 命名空间
运行容器时显式指定 --pid=host,容器将复用宿主机的 PID 命名空间:
-
docker run -it --pid=host --rm ubuntu:22.04 ps aux | head -10—— 直接列出宿主机前 10 个进程 -
docker run -d --pid=host --name jvm-debugger openjdk:17-jdk-slim sleep infinity—— 启动一个调试容器,后续可进它查宿主机上所有 Java 进程
在 docker-compose.yml 中正确写法
YAML 对布尔值敏感,pid: host 必须加引号,否则会被解析成 true:
- ✅ 正确:
pid: "host" - ❌ 错误:
pid: host(YAML 解析为布尔真值,Docker 报错或忽略)
示例片段:
services:
debugger:
image: openjdk:17-jdk-slim
pid: "host"
command: ["sleep", "infinity"]
调试宿主机 JVM 进程的关键操作
容器有了宿主机 PID 视图后,还需注意 JVM 的 attach 权限和路径可见性:
- 先在容器内确认目标 JVM 进程 PID:例如
ps aux | grep 'java.*-jar' - JVM 启动时建议加参数:
-XX:+UseContainerSupport -XX:+UnlockDiagnosticVMOptions,确保生成可访问的/tmp/.java_pid<pid> - 若未加参数且
jstack <pid>报 “Unable to open socket file”,可尝试:su -c 'jstack <pid>' <java-user>(切换到 JVM 启动用户执行) - 避免挂载宿主机
/tmp到容器,否则 socket 文件可能因 UID 或路径映射失效
安全与使用边界提醒
--pid=host 是强能力配置,意味着容器内进程能:
- 看到并发送信号(如
kill -3)给任意宿主机进程 - 读取
/proc/<pid>/下内存、线程、环境变量等敏感信息 - 不适用于生产环境的普通业务容器,仅推荐用于运维、调试、监控类可信容器


















