一、问题描述

执行 docker ps -a 命令的时候,输出如下内容:

[root@node01 ~]# docker ps -a
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

通过 sudo systemctl status docker 命令检查 Docker 守护进程是否处于活动状态的时候,发现输出中有 “ … http: Accept error: accept unix /run/docker.sock: accept4: too many open files; … ” 相关信息,具体如下:

[root@node01 ~]# systemctl status docker
	● docker.service - Docker Application Container Engine
	   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
	  Drop-In: /etc/systemd/system/docker.service.d
	           └─override.conf
	   Active: active (running) since Mon 2026-01-26 09:34:48 CST; 2h 1min ago
	     Docs: https://docs.docker.com
	 Main PID: 8080 (dockerd)

	......

  	Jan 26 09:08:36 node01 dockerd[19477]: 2026/01/26 09:08:36 http: Accept error: accept unix /run/docker.sock: accept4: too many open files; retrying in 1s

	......

二、问题原因

“ … http: Accept error: accept unix /run/docker.sock: accept4: too many open files … ” 这段信息表明了 Docker 守护进程(dockerd)此时已经达到了系统对 “打开文件描述符数量” 的限制,无法再接受新的连接了。

之所以会这样,是由于 Linux 系统对每个进程能打开的文件描述符(file descriptors, FDs)的数量事有限制的。这个限制分为两类:

  • soft limit(软限制):当前生效的限制,可由用户自行调整(但不能超过 hard limit)。
  • hard limit(硬限制):上限,只有 root 或具有 CAP_SYS_RESOURCE 权限的进程才能提高。

三、解决方案

【步骤一】临时提高 Docker 进程的文件描述符限制

编辑 systemd 的 Docker 服务配置,执行如下命令:

sudo systemctl edit docker

在打开的编辑器中输入如下内容:

[Service]
LimitNOFILE=65536

保存并退出。

重新加载 systemd 并重启 Docker,依次执行如下命令:

sudo systemctl daemon-reload
sudo systemctl restart docker

【步骤二】永久修改系统级限制

编辑 /etc/security/limits.conf,执行如下命令:

vim /etc/security/limits.conf

在打开的文件中添加如下内容:

* soft nofile 65536
* hard nofile 65536
root soft nofile 65536
root hard nofile 65536

【步骤三】为容器配置日志轮转

容器数量较多或日志文件较大,也有可能导致 FD 消耗殆尽。我们通过配置日志轮转来限制日志的数量和大小。

编辑 /etc/docker/daemon.json 文件,执行如下命令:

vim /etc/docker/daemon.json

在打开的文件中添加如下内容:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  }
}

重启 Docker,执行如下命令:

sudo systemctl restart docker

【步骤四】验证修复结果

重启 Docker 后,再次检查状态(看还有没有再输出 “… accept4: too many open files …” 相关信息了),执行如下命令:

systemctl status docker

更多推荐