Ubuntu 20.04 Snap版Docker报too many open files故障求助
问题排查与解决方案
核心原因
通过Snap安装的Docker受Snap沙箱的独立资源限制管控,系统级的/etc/sysctl.conf修改无法直接覆盖Snap应用的进程限制,导致Docker守护进程的文件句柄软限制仍维持默认的1024。当容器数量较多、并发操作频繁时,就会触发too many open files错误,进而引发Portainer界面的容器列表加载失败、无法创建容器等功能异常。
排查步骤
- 确认Docker进程的文件句柄限制:
- 找到Docker守护进程PID:
ps aux | grep dockerd - 查看当前限制:
cat /proc/<PID>/limits | grep "Open files" - 若输出中软限制(Soft Limit)为1024,即可确认是限制不足导致的问题。
- 找到Docker守护进程PID:
解决方案
1. 临时调整Docker文件句柄限制(重启后失效)
- 执行命令设置Docker守护进程的默认文件句柄限制:
snap set docker daemon.args="--default-ulimit nofile=65536:65536" - 重启Docker服务:
snap restart docker - 再次通过排查步骤验证软限制是否已更新为65536。
2. 永久调整Docker文件句柄限制
- 编辑Snap Docker的守护进程配置文件:
sudo nano /var/snap/docker/current/config/daemon.json - 添加以下配置内容(若文件已存在,合并到现有JSON结构中):
{ "default-ulimits": { "nofile": { "Name": "nofile", "Hard": 65536, "Soft": 65536 } } } - 保存退出后重启Docker:
snap restart docker - 验证限制是否生效。
3. 同步调整Portainer容器的文件句柄限制
若Portainer自身也存在文件句柄不足的问题,需在启动容器时指定限制:
- 停止并删除现有Portainer容器(注意备份数据):
docker stop portainer && docker rm portainer - 用带ulimit参数的命令重新启动Portainer:
docker run -d -p 9000:9000 --name portainer --restart=always --ulimit nofile=65536:65536 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer-ce
4. 额外排查:检查系统总文件句柄占用
- 查看系统当前总打开文件数:
lsof | wc -l - 若数值接近系统硬限制(默认1048576),可进一步通过
lsof -p <PID>定位占用文件句柄较多的进程,排查是否有异常进程导致资源耗尽。
内容的提问来源于stack exchange,提问作者zkvvoob
相关产品推荐
相关产品推荐

