Docker Desktop容器报“Too many open files”问题大概率源于其底层嵌入式Linux VM(HyperKit/WSL2)中init和dockerd进程的默认ulimit -n过低(常为1024),该限制不继承宿主机配置,且macOS终端或Windows系统级ulimit设置对其无效;需通过修改settings.json(macOS)或wsl.conf(Windows)永久提升VM层nofile限制。

Docker Desktop 容器报 “Too many open files” 时,问题大概率不在容器里,而在宿主机的 Docker Desktop 进程本身 —— 它运行在 macOS 或 Windows 的轻量级 Linux VM 中,其 ulimit -n 默认极低(常为 1024),且不继承宿主机配置。
为什么 Docker Desktop 的容器比 Linux 上的 docker 更容易触发 nofile 耗尽?
Docker Desktop 底层用的是一个嵌入式 Linux VM(HyperKit / WSL2),这个 VM 的 init 进程(PID 1)和 dockerd 进程启动时,ulimit -n 基本沿用 systemd 或 init 系统的默认值,而非你 macOS 终端里设的 ulimit -n 65536。这意味着:
- 你在 Terminal 执行
ulimit -n看到的是 shell 限制,对 VM 内的 dockerd 完全无效 - 容器启动时继承的是 VM 中 dockerd 进程的
nofile限制,不是你本地终端的 - macOS 上即使改了
/etc/sysctl.conf或launchd配置,也影响不到 Docker Desktop 的 VM - Windows + WSL2 场景下,若未显式配置 WSL2 的
/etc/wsl.conf,其默认nofile同样卡在 1024
如何确认是 Docker Desktop VM 自身的 nofile 不足?
别急着改容器或 compose,先定位瓶颈是否在 VM 层:
- 打开 Docker Desktop 设置 → Troubleshoot → “Open terminal”(macOS)或直接进入 WSL2(Windows)
- 执行:
cat /proc/1/limits | grep "Max open files"—— 看 PID 1(即 init)的硬/软限 - 再查 dockerd:
pgrep dockerd | xargs -I{} cat /proc/{}/limits | grep "Max open files" - 统计当前已用 FD:
ls -1 /proc/1/fd/ 2>/dev/null | wc -l;如果接近上限(比如 1020+),就是它了
macOS 上永久提升 Docker Desktop VM 的 nofile(实测有效)
macOS 的 Docker Desktop 使用 HyperKit,需通过 ~/.docker/desktop/settings.json 注入内核参数(2026 年起支持):
- 关闭 Docker Desktop
- 编辑
~/.docker/desktop/settings.json,添加:{"vmSettings": {"kernelParameters": ["fs.file-max=1048576", "fs.nr_open=1048576"]}} - 重启 Docker Desktop
- 进 VM 终端验证:
cat /proc/sys/fs/file-max和cat /proc/1/limits | grep files - 如仍为 1024,说明 dockerd 启动未加载 ulimit:需配合
dockerd的 systemd service override(仅限较新版本),或改用下一节的 WSL2 方案
Windows + WSL2 用户请直接改 wsl.conf
这是目前最稳定、最可控的方式:
- 在 Windows 上创建或编辑
%USERPROFILE%\AppData\Local\Packages\DockerDesktop\wsl\data\etc\wsl.conf(路径可能因 WSL 发行版而异,优先查wsl -l -v对应发行版) - 写入:
[boot] systemd=true [interop] enabled=true [limits] processors=2 memory=2GB nofile=65536
- 重启 WSL:
wsl --shutdown,再启动 Docker Desktop - 进 WSL 终端验证:
cat /proc/1/limits | grep files应显示65536 - 注意:
nofile是 WSL2 全局设置,所有进程(包括 dockerd)都会继承
真正卡住的从来不是容器里的 Nginx 或 Node.js,而是 Docker Desktop 自己跑的那个“小系统”——它太轻量,也太封闭。改配置前务必确认你操作的是 VM 层,而不是在宿主机终端反复 ulimit,那只会让你越调越迷。











