WSL2 中 Docker 突然无法通过代理拉取镜像问题排查

作者机器为 win11,最近将 Docker Desktop 升级到了 v4.43.2 版本,然后就出现一个很奇怪的问题:代理是正常的,但是 Docker 就是连接不上,拉取镜像时,直接报错 connect: connection refused。

1
2
3
4
5
6
# 拉取镜像
docker pull redis

# 报错:
Using default tag: latest
Error response from daemon: Get "https://registry-1.docker.io/v2/": proxyconnect tcp: dial tcp 127.0.0.1:7890: connect: connection refused

问题分析

首先,导致这个问题的原因可能有两种情况:

  1. Docker Desktop 是通过 wsl2 安装的,期间 windows 有更新,可能导致 wsl 网络产生了问题
  2. 升级 Docker Desktop 后配置都没有动过,可能是 Docker Desktop 本身问题

从网上了解到,将 wsl 的网络改成 NAT 就可以恢复 networkingMode = NAT。但是为了使用 wsl 镜像网络的优势,先从第 2 点开始排查,最终通过改变启动顺序解决了。

我的 .wslconfig 配置如下

1
2
3
4
5
6
7
8
9
10
11
12
# 配置镜像网络,参考: https://learn.microsoft.com/zh-cn/windows/wsl/networking
# 网络模式为镜像, 打开后代理无法使用

[wsl2]
networkingMode=mirrored
dnsTunneling=true
autoProxy=true
firewall=true
hostAddressLoopback=true

[experimental]
hostAddressLoopback=true

解决方案

首先一开始我的状态是开启了系统代理,wsl2 是 mirrored 模式,查看 docker info 中的代理结果如下:

1
2
3
HTTP Proxy: http://127.0.0.1:7890
HTTPS Proxy: http://127.0.0.1:7890
No Proxy: 172.31.*,172.30.*,172.29.*,172.28.*,172.27.*,172.26.*,172.25.*,172.24.*,172.23.*,172.22.*,172.21.*,172.20.*,172.19.*,172.18.*,172.17.*,172.16.*,10.*,192.168.*,127.*,localhost,<local>

我的代理不论是在 windows 上还是在 wsl 都能够访问,但是 docker pull 依然报错:

1
2
3
docker pull redis
Using default tag: latest
Error response from daemon: Get "https://registry-1.docker.io/v2/": proxyconnect tcp: dial tcp 127.0.0.1:7890: connect: connection refused

然后修改 Docker Desktop 的代理配置:[Settings/Resources/Proxies]

image-20250801083235022

重启 Docker Desktop 后,仍然无效。

然后按以下步骤解决了:

  1. 关闭系统代理
  2. 关闭 Docker Desktop 的手动代理配置
  3. 重启 Docker Desktop
  4. 打开系统代理
  5. 配置 Docker Desktop 手动代理

第 3 步启动后,docker info 的代理部分为:

1
2
3
HTTP Proxy: http.docker.internal:3128
HTTPS Proxy: http.docker.internal:3128
No Proxy: hubproxy.docker.internal

后记:

具体是什么原因导致的,我也不清楚,但终归是恢复了,就不深究了。

参考

本文参考以下文章,在此致以诚挚谢意!

docker在WSL2环境中的代理问题 - 冰化了还有棍儿