docker 通过 --pids-limit 参数(推荐,20.10+)或 --cgroup-parent 配置限制容器进程数,对应 cgroup 的 pids.max;需验证 /sys/fs/cgroup/pids.max 是否生效,并依应用类型合理设值。

在 Docker 中,PidLimit(即进程数限制)用于限制容器内可创建的进程/线程总数(对应 Linux 的 pids.max cgroup 控制项),防止因 fork 炸弹、应用泄漏或异常递归导致系统资源耗尽。Docker 本身不提供直接叫 --pid-limit 的参数,但可通过 --pids-limit 或 cgroup v2 配置实现。
使用 --pids-limit 参数(推荐,Docker 20.10+)
这是最简单、原生支持的方式,适用于启用 cgroup v2 的宿主机(现代 Linux 发行版默认开启):
- 启动容器时添加
--pids-limit=512,限制最多 512 个进程/线程 - 设为
-1表示不限制(默认行为);设为0会报错 - 示例:
docker run --pids-limit=256 -d nginx - 该值会写入容器的
/sys/fs/cgroup/pids.max(cgroup v2)或/sys/fs/cgroup/pids/pids.max(cgroup v1,需手动挂载)
通过 --cgroup-parent 手动指定 cgroup(兼容旧版本或精细控制)
当需要更灵活管理(如批量限制多个容器)或 Docker 版本较老(pids.max 限制的 cgroup:
- 在宿主机上创建 cgroup 目录并设限:
mkdir -p /sys/fs/cgroup/my-limited-group<br>echo 384 > /sys/fs/cgroup/my-limited-group/pids.max
- 运行容器时绑定:
docker run --cgroup-parent=my-limited-group -d myapp - 注意:需确保 Docker daemon 启用 cgroup v1 支持(
"cgroup-parent": "/sys/fs/cgroup"等配置),且宿主机未强制使用 v2
验证与调试容器的 Pid 限制是否生效
进入容器后,检查实际生效的限制值:
- 执行
cat /sys/fs/cgroup/pids.max(cgroup v2)或cat /sys/fs/cgroup/pids/pids.max(cgroup v1) - 查看当前已用进程数:
cat /sys/fs/cgroup/pids.current - 若容器内 fork 失败并报
Resource temporarily unavailable,大概率是触达了 pids.max - 也可用
docker inspect 容器ID | grep PidsLimit查看运行时配置(仅对--pids-limit生效)
注意事项与常见问题
配置 PidLimit 不是“一设永逸”,需结合应用行为合理设置:
- Java 应用(尤其使用多线程池或 Netty)可能默认创建数百线程,建议从 512–2048 起步测试
- Node.js、Python 单进程应用通常 128–256 即可;Nginx 默认 worker 进程 + connection threads,256 足够
- Swarm/K8s 场景下,需通过 runtime 配置或 Pod annotation(如
io.kubernetes.cri-o.pids-limit: "512")传递限制 - 若宿主机禁用 cgroup v2 且未启用 pids 子系统,
--pids-limit将静默失效,务必验证pids.max文件是否存在并可读










