dockerd连接被拒绝本质是WSL中守护进程未运行,需依次检查systemctl状态、dockerd进程是否存在、WSL发行版运行状态、socket路径及权限、磁盘空间、时间同步等核心环节。

dockerd 连接被拒绝,先看 WSL 里有没有 dockerd 在跑
“连接被拒绝”不是 Docker Desktop 界面卡住,而是 docker CLI 尝试连 unix:///var/run/docker.sock 时直接报错,说明 Linux 侧的守护进程根本没起来。这不是 Windows 端网络或代理问题,是 WSL 内部引擎挂了。
进 WSL 终端(比如 wsl -d docker-desktop),执行:
systemctl is-active docker
如果返回 inactive 或报错 Failed to connect to bus,说明 systemd 没启用,或者 dockerd 根本没注册为服务——这在 Docker Desktop 的专用发行版里很常见,它默认用 containerd 直启,不走 systemd。
更直接的办法是查进程:
ps aux | grep dockerd
没输出?那 dockerd 确实没运行。别急着重装,先确认是不是 WSL 发行版状态异常:
-
wsl -l -v看docker-desktop和docker-desktop-data是否都为Running - 如果状态是
Stopped或Starting卡住,说明 WSL 层已失联,dockerd不可能启动 - 如果状态是
Unknown,大概率是ext4.vhdx文件损坏,对应错误码0x80070570
WSL 分发版卡在 START_PENDING 怎么办
START_PENDING 是 Windows 服务管理器里 WSLService 的状态,不是 Docker 自己的服务。只要它卡在这儿,所有 WSL 命令(包括 wsl -l -v、wsl -d docker-desktop)都会超时或无响应,dockerd 自然连不上 socket。
先查服务真实状态:
Get-Service WSLService | Select-Object Name, Status, StartType
如果 Status 是 StartPending,不要双击重试或手动 start,90% 是底层依赖没就绪。按顺序检查:
- CPU 虚拟化是否开启:任务管理器 → 性能 → CPU → “虚拟化”必须显示“已启用”
-
VirtualMachinePlatform和Microsoft-Windows-Subsystem-Linux两个功能是否均为Enabled(用Get-WindowsOptionalFeature查) - 是否禁用了 Hyper-V?Docker Desktop WSL2 后端**不需要** Hyper-V 开启,反而开了可能冲突;但
VirtualMachinePlatform必须开 - 重启后仍卡住,试试
sc stop LxssManager && sc start WSLService(注意旧系统用LxssManager,新系统用WSLService)
docker.sock 权限不对或路径不存在
即使 dockerd 在跑,Windows 侧的 docker CLI 也可能因 socket 路径映射失败而报“连接被拒绝”。Docker Desktop 默认把 socket 挂载到 /var/run/docker.sock,但它依赖 WSL 的自动转发机制。
进 docker-desktop 发行版后检查:
ls -l /var/run/docker.sock
如果提示 No such file or directory,说明 dockerd 没成功创建 socket,常见于:
- 磁盘空间不足:
df -h看/和/mnt/wsl是否满(尤其docker-desktop-data卷) - SELinux 或 ACL 限制:Windows 文件共享目录(如
/mnt/c)下挂载 volume 时,若启用了metadata选项但 NTFS 权限混乱,可能导致 dockerd 初始化失败 -
/etc/wsl.conf里误配了automount = false或root = /,干扰了 socket 路径解析
临时验证方式:手动起一个 dockerd 实例(仅测试):
sudo dockerd --host=unix:///tmp/docker.sock &
然后改 CLI 配置指向它:export DOCKER_HOST=unix:///tmp/docker.sock。能通说明是默认 socket 路径链路断了,不是引擎本身问题。
时间不同步导致 TLS 握手失败,看着像连接拒绝
WSL2 虚拟机时间如果比 Windows 主机快/慢超过几分钟,dockerd 启动时生成的证书会因时间戳越界被拒绝,客户端连 socket 会静默失败,日志里只显示“connection refused”,实际是 TLS 验证提前终止。
检查时间差:
wsl -d docker-desktop date<br>date
如果差值 > 60 秒,强制同步:
sudo hwclock -s
但更治本的是在 /etc/wsl.conf 加上:
[wsl2]<br>kernelCommandLine = "clocksource=acpi_pm"
并确保 Windows 主机开启了“通过 Internet 时间服务器同步”(设置 → 时间和语言 → 日期和时间 → 同步设置)。否则每次重启 WSL,时间又会漂移。
这个点最容易被忽略:你查了所有服务、进程、权限,全正常,就差这一秒的时钟对齐。


















