要全局调整 Docker 容器文件描述符限制,需两步:先通过 systemd 配置 dockerd 自身的 LimitNOFILE 和 LimitNPROC 为 65536 并重启;再在 /etc/docker/daemon.json 中设置 default-ulimits.nofile 为软硬限各 65536,重启 Docker 后新容器默认生效。

要调整 Docker 系统全局的文件描述符限制,核心是让所有新启动的容器默认获得更高的 nofile 值,而不是逐个容器用 --ulimit 设置。这需要两层配合:宿主机对 dockerd 进程自身的限制,以及 Docker 守护进程对容器的默认 ulimit 配置。
修改 systemd 对 dockerd 的资源限制
这是前提——如果 dockerd 自身被系统限制了打开文件数,它就无法给容器分配更高的值。
- 创建或编辑覆盖配置:
/etc/systemd/system/docker.service.d/override.conf - 写入以下内容:
[Service] LimitNOFILE=65536 LimitNPROC=65536
- 重载并重启服务:
sudo systemctl daemon-reload && sudo systemctl restart docker - 验证是否生效:
systemctl show docker | grep LimitNOFILE应输出65536
配置 Docker daemon 默认 ulimit
在 dockerd 获得足够权限后,再让它把高限制“分发”给容器。
- 编辑
/etc/docker/daemon.json(若不存在则新建) - 添加
default-ulimits字段:
{
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 65536
}
}
}
- 保存后重启 Docker:
sudo systemctl restart docker - 此后所有新启动、且未显式指定
--ulimit的容器,ulimit -n将默认为 65536
验证全局配置是否生效
别只信配置文件,要实测结果:
- 启动一个基础容器:
docker run --rm alpine:latest sh -c 'ulimit -n',应输出65536 - 检查容器内进程实际可用 fd 数:
docker run --rm alpine:latest sh -c 'ls /proc/1/fd | wc -l',数值应远低于上限 - 注意:已运行的容器不受影响,仅新容器继承该默认值
配套建议:宿主机系统级上限也要够用
Docker 全局配置再高,也受限于内核总容量。
- 查看当前系统最大文件句柄数:
cat /proc/sys/fs/file-max - 若低于 200 万,建议调高(尤其在高并发场景):
echo 2097152 | sudo tee /proc/sys/fs/file-max - 如需永久生效,写入
/etc/sysctl.conf:fs.file-max = 2097152,再执行sudo sysctl -p


















