Docker 中配置 PID 限制需使用 --pids-limit 参数(如 docker run --pids-limit=128),通过 cgroup 的 pids.max 限制容器内进程/线程总数,而非仅依赖 PID 命名空间隔离;-1 表示不限制(默认,不推荐生产环境),0 无效。

在 Docker 中配置 PID 限制,核心是防止容器内恶意或异常代码(如 fork 炸弹)耗尽宿主机的进程 ID 资源,从而避免影响其他容器甚至整个系统。这不是靠“隔离 PID 命名空间”就能解决的——命名空间只管进程可见性,而 pids.max 才真正限制可创建的进程/线程总数。
用 --pids-limit 直接设上限(推荐,Docker 20.10+)
这是最简洁、原生支持的方式,适用于默认启用 cgroup v2 的现代系统(如 Ubuntu 22.04+、CentOS 8+、Debian 11+):
- 启动时加参数:
docker run --pids-limit=128 -d nginx,表示该容器最多运行 128 个进程或线程 - 设为
-1表示不限制(Docker 默认行为),不建议生产环境使用 - 值为
0会报错,不可用 - 该值会写入容器内的
/sys/fs/cgroup/pids.max(cgroup v2)或/sys/fs/cgroup/pids/pids.max(cgroup v1)
通过 --cgroup-parent 手动绑定自定义 cgroup(兼容旧版或批量管控)
适合 Docker 版本较老(
- 先在宿主机创建带 pids.max 的 cgroup:
sudo mkdir -p /sys/fs/cgroup/limited-pidsecho 96 | sudo tee /sys/fs/cgroup/limited-pids/pids.max - 运行容器时绑定:
docker run --cgroup-parent=limited-pids -d myapp - 注意:需确认 Docker daemon 支持 cgroup v1(检查
/etc/docker/daemon.json是否含"cgroup-parent": "/sys/fs/cgroup"等配置),且宿主机未强制禁用 v1
验证是否生效与快速排障
配置后务必验证,不能只信命令执行成功:
- 进容器检查限制值:
cat /sys/fs/cgroup/pids.max(v2)或cat /sys/fs/cgroup/pids/pids.max(v1) - 看当前已用数量:
cat /sys/fs/cgroup/pids.current - 观察是否触发限制:若容器内程序报
Resource temporarily unavailable,基本就是触达了 pids.max - 查运行时配置:
docker inspect | grep PidsLimit(仅对 --pids-limit 生效)
搭配关键安全实践防绕过
PID 限制本身有效,但若配置不当仍可能被绕过:
- 禁止使用
--pid=host:它让容器共享宿主机 PID 命名空间,完全失效所有容器级 PID 限制 - 避免
--privileged或过度授予cap_sys_admin:特权容器可能修改自身 cgroup 配置 - 监控异常增长:定期执行
docker exec <id> ps aux | wc -l</id>,结合 Prometheus + cAdvisor 可自动告警 - 合理设值参考:Web 服务类容器 64–256,Jupyter Notebook 类 100–200,批处理任务视并发线程数上浮 20%


















