根据错误日志,关键问题是 Docker 无法通过 systemd 的 socket 激活机制找到监听套接字。以下是针对性解决方案:
1. 修改 Docker 服务配置
cat > /etc/systemd/system/docker.service <<'EOF'
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=simple # 修改为 simple 类型
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
[Install]
WantedBy=multi-user.target
EOF
关键修改点:
- 将
Type=notify
改为Type=simple
- 明确指定 socket 路径
-H unix:///var/run/docker.sock
2. 清理并重建套接字目录
systemctl stop docker
rm -f /var/run/docker.sock
mkdir -p /var/run/docker
chmod 755 /var/run/docker
3. 重新加载并启动服务
systemctl daemon-reload
systemctl start docker
4. 验证修复结果
systemctl status docker
ss -lnp | grep docker
docker info
故障原因说明:
该错误通常发生在:
- systemd 的 socket 激活机制未正确配置
- dockerd 默认尝试使用 fd:// 但找不到套接字
- /var/run/docker.sock 权限或路径异常
替代方案(如果仍失败):
# 完全禁用 socket 激活
cat > /etc/docker/daemon.json <<EOF
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}
EOF
注意事项:
- 如果使用防火墙,需放行2375端口
- 生产环境建议配置TLS加密
- 检查/var/run目录是否挂载为tmpfs
请按顺序执行上述步骤,如果仍有问题,请提供:
ls -ld /var/run/docker*
cat /etc/docker/daemon.json
(如果有)systemctl cat docker
的完整输出