直接通过--ulimit参数或docker-compose.yml配置ulimits即可限制容器内进程最大文件句柄数;默认1024不足高并发,需显式设为如nofile=65536:65536,仅作用于PID 1及其直系子进程,多进程需防ulimit重置,并可用daemon.json设全局默认值。

直接通过 --ulimit 参数或 docker-compose.yml 配置 ulimits 即可限制容器内进程能打开的最大文件句柄数。默认值通常只有 1024,远不够高并发服务使用,必须显式设置。
用 docker run 设置 nofile 限制
运行容器时用 --ulimit 指定软硬限制,格式为 nofile=soft:hard:
-
docker run --ulimit nofile=65536:65536 nginx:软硬限都设为 65536 -
docker run --ulimit nofile=32768:65536 nginx:软限 32768,硬限 65536,允许容器内进程后续调高软限 - 该设置只作用于容器主进程(PID 1)及其直接子进程;若用 bash -c 或 supervisord 启动多进程,需确保启动脚本不重置 ulimit
在 docker-compose.yml 中配置
适合编排场景,便于版本管理和批量部署:
- 完整写法(推荐生产环境):
ulimits:<br> nofile:<br> soft: 65536<br> hard: 65536
- 简写形式(仅设软限,硬限沿用 Docker 默认):
ulimits:<br> nofile: 65536
- 支持同时配置多个限制,例如:
ulimits:<br> nofile: 65536<br> nproc: 4096
全局默认设置(daemon.json)
若所有容器都需要统一的 nofile 值,可在 /etc/docker/daemon.json 中添加:
"default-ulimit": {"nofile": {"Name": "nofile", "Soft": 65536, "Hard": 65536}}- 修改后需重启 Docker 守护进程:
systemctl restart docker - 注意:此设置不影响已运行容器,只对新创建容器生效
验证与调试
进容器后执行以下命令确认是否生效:
-
ulimit -n:查看当前 soft nofile 值 -
ulimit -Hn:查看 hard nofile 值 -
cat /proc/self/limits | grep nofile:更准确显示软硬限及单位 - 若提示 permission denied,说明容器缺少
CAP_SYS_RESOURCE能力(K8s 中需在 securityContext 中显式添加)


















