daemon.json 不支持直接设置容器进程数限制,但可通过 default-ulimits.pids 设置全局默认 pid 限制(如 hard/soft=512),并配合 systemd 的 tasksmax 对 dockerd 自身设限(如 4096),双管齐下防止 fork 爆炸导致系统僵死。
daemon.json 本身不支持直接设置“容器进程数限制”(比如每个容器最多多少个子进程),它没有类似 max-pids-per-container 这样的原生字段。但你可以通过两种互补方式实现等效控制:一是限制单个容器的 pid 数量(靠 --pids-limit 或 default-ulimits),二是从节点级约束整个宿主机的 pid 总量(靠 systemd)。两者结合,才能真正防住 fork 爆炸导致的系统僵死。
用 ulimit 限制每个容器的进程/线程数
Docker 将 Linux 的 pids cgroup 控制器映射为 ulimit -u(即 max user processes),这是最常用、最直接的方式:
- 在
/etc/docker/daemon.json中添加全局默认值(所有新容器生效):
- 保存后执行
sudo systemctl restart docker - 该配置会让每个容器默认最多创建 512 个进程/线程(含 shell、worker、线程等)
- 若某容器需更高上限,启动时可覆盖:
docker run --ulimit pids=2048:2048 ...
用 systemd 限制 dockerd 自身的 PID 使用
仅设容器级 limit 不够——如果大量容器同时启动或某个容器疯狂 fork,dockerd 进程自身可能触发内核 pid_max 饱和,甚至拖慢 systemd 响应。必须对守护进程加硬限:
- 创建覆盖配置:
sudo mkdir -p /etc/systemd/system/docker.service.d - 写入
/etc/systemd/system/docker.service.d/override.conf:
-
TasksMax是 systemd 对该服务能创建的总任务数(即线程+进程)上限,推荐设为 2048–8192,视宿主机内存和负载而定 - 执行
sudo systemctl daemon-reload && sudo systemctl restart docker
验证是否生效
进入任一容器后运行:
-
ulimit -u→ 查看当前 soft pids 限制 -
cat /proc/self/limits | grep "Max processes"→ 查看完整 soft/hard 值 - 在宿主机上运行
systemctl show docker --property=TasksCurrent→ 查看 dockerd 当前实际占用的任务数
注意:default-ulimits.pids 在 Docker CE 20.10+ 中默认可用,无需开启 experimental;旧版本需确认是否支持,否则建议升级或改用 --pids-limit 显式启动。











