首页/云/Docker 容器速查/docker run --ulimit 设置进程资源上限
资源与安全50 条

docker run --ulimit 设置进程资源上限

设置容器内资源上限:文件句柄、进程数、核心转储等,软硬限制用 软:硬 格式;取值 -1 表示不限制。

Docker 容器速查云更新于 2026-10-13

进程级资源上限

--ulimit 设置容器内进程的 rlimit,控制文件句柄数、进程与线程数、核心转储大小、栈大小、可锁定内存等。不显式指定时,容器继承守护进程的取值,而守护进程又受 systemd 限制,所以「容器里能开多少文件」往往由两层配置共同决定。取值范围写「软:硬」,-1 表示不限制。

基本信息

语法--ulimit nofile=65536:65536,可重复多次
常用项nofile / nproc / core / stack / memlock
默认来源继承 dockerd 的 rlimit(受 systemd 单元限制)
守护层默认daemon.json 的 default-ulimits 统一下发

典型使用场景

  • 高并发服务报 too many open files:提高文件句柄上限
  • 多线程应用创建线程失败:放开进程与线程数限制
  • 生产禁用核心转储:把 core 设为 0,避免大文件突然写满磁盘
  • 需要 mlock 的组件:数据库与加密库要求锁定内存,需放开 memlock
  • 构建容器需要更多并发:编译任务同时打开大量文件,按需上调

设置与核对

设置与核对
# 提高文件句柄与进程数上限
docker run -d --name web --ulimit nofile=65536:65536 --ulimit nproc=4096:4096 nginx:1.27-alpine

# 容器内核对生效值
docker exec web sh -c 'ulimit -n; ulimit -u'

# 禁用核心转储
docker run --rm --ulimit core=0:0 alpine sh -c 'ulimit -c'

# 查看运行时配置里记录的取值
docker inspect -f '{{json .HostConfig.Ulimits}}' web

常用项对照

项含义调整场景
nofile同时可打开的文件句柄数网关、消息队列报 too many open files
nproc进程与线程数上限多线程应用创建线程失败
core核心转储文件大小上限设为 0 可避免异常退出时写出巨型文件
memlock可锁定内存上限数据库与加密组件需要 mlock
stack进程栈大小栈偏大或递归较深的应用
软限是进程当前生效值,硬限是能提升到的上限;脚本里把软硬写成同一个值,后续调整不容易被硬限卡住。
报 too many open files 时,除了容器内的 ulimit,还要看 systemd 给 dockerd 的 LimitNOFILE,两层里更小的那个才是实际瓶颈。
容器内 ulimit -n 看软限、ulimit -Hn 看硬限:只调高软限而硬限偏低时,运行中的应用想自行提升上限仍然会被拒绝,排查时两个值都要打印出来对照。

易错点

  • 只调容器内 ulimit:守护进程侧被 systemd 限制时上限仍然卡住,两层都要核对
  • 把 nofile 调得极大:单机 fd 总量是共享资源,过量分配会让其他服务在高峰期受限
  • nproc 设置为不限制:一个失控的进程反复 fork 就能把宿主拖垮,按业务需要给合理上限
  • 改完不做压测:上限只是许可值,实际能否撑住要看内核参数、连接数与文件描述符的真实消耗

数据来源与参考

  • Docker 官方文档:Set ulimits in a container(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌