开发环境

  • Windows11, version 24H2(傻逼才升级24H2,建议22H2)
  • WSL2,发行版 Ubuntu-22.04
  • Docker Desktop 最新版

BUG复现

环境设置

使用 Clash for Windows 开启系统代理,开放端口7890并开启局域网代理(LAN enabled)。

在 Windows 上安装 Docker Desktop 后,查看 Docker Desktop >> Settings >> Resources >> Proxy 可发现其会自动识别 Windows 系统代理。

Docker Desktop 中自动识别系统代理

Windows 中系统代理可以在 设置 >> 网络和Internet >> 代理 中查看。

可以看到,Docker Desktop 读取系统代理为 http://127.0.0.1:7897

进入WSL2使用Docker

从 Windows 进入 WSL2 CLI 后,输入指令 docker pull hello-world 报错:
docker pull proxyconnect tcp: dial tcp 127.0.0.1:7890: connect: connection refused。这是经典的 因 Docker 代理设置不当 导致的传输问题。

排除BUG

在 WSL2 CLI 界面输入 env | grep -i proxy 来查看当前 bash 对话环境下的系统代理,发现如下内容:

HTTP_PROXY=http://127.0.0.1:7897
HTTPS_PROXY=https://127.0.0.1:7897

这些内容也可以通过 docker info | grep -i proxy 获得。

因为 Windows Subsystem 的网络设计是将宿主机和 WSL2 虚拟机网卡分开设置的,所以 127.0.0.1 在宿主机和 WSL2 环境中指代的是不同的IP地址!

解决BUG

更换 Clash 客户端

将 Clash for Windows 换成 Clash Verge,并启用其中的 TUN(虚拟网卡)设置:

设置 Docker Desktop 的代理

在 Windows PowerShell 输入 ipconfig 查看宿主机IP地址后,将其替换127.0.0.1,并输入 Docker Desktop Proxy 设置中去。也就是显式地指定代理的IP地址。

成功解决问题,现在 docker pull 能够正常拉取云端镜像。


練習は本番のように、本番は練習のように