防范 fork 炸弹关键在于通过 cgroup 的 pids.max 限制进程/线程总数,而非仅依赖 PID 命名空间隔离;推荐使用 --pids-limit=128(Docker 20.10+)直接设上限,值为-1(默认)不安全,0无效,需配合禁用 --pid=host 和特权模式防绕过。

在 Docker 中防范 fork 炸弹,关键不是靠 PID 命名空间隔离(它只控制进程可见性),而是真正限制容器能创建的进程/线程总数——这必须通过 cgroup 的 pids.max 机制 实现。Docker 提供了原生、简洁的方式完成这一限制。
用 --pids-limit 直接设上限(推荐,Docker 20.10+)
这是最直接、最可靠的方法,适用于默认启用 cgroup v2 的现代系统(如 Ubuntu 22.04+、Debian 11+、CentOS 8+):
- 启动容器时加参数: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 版本较老,或需统一管控多个容器的场景:
- 先在宿主机创建带限制的 cgroup:sudo mkdir -p /sys/fs/cgroup/limited-pids && echo 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" 等配置)
验证是否生效,不能只信命令执行成功
配置后必须进入容器检查实际生效值:
- 查看限制值:cat /sys/fs/cgroup/pids.max(v2)或 cat /sys/fs/cgroup/pids/pids.max(v1)
- 查看当前已用数量:cat /sys/fs/cgroup/pids.current
- 观察是否触发限制:若容器内程序 fork 失败并报 Resource temporarily unavailable,说明已触达上限
- 查运行时配置:docker inspect | grep PidsLimit(仅对 --pids-limit 生效)
搭配关键安全实践防绕过
PID 限制本身有效,但以下配置会让它完全失效:
- 禁止使用 --pid=host:它让容器共享宿主机 PID 命名空间,所有容器级限制形同虚设
- 避免 --privileged 或过度授予 cap_sys_admin:特权容器可能修改自身 cgroup 配置
- 合理设值:根据应用类型设定(如 Nginx 通常 50–200,Java 应用建议 256–512),过低影响正常运行,过高失去防护意义


















