如何给 WSL 使用宿主机 VPN 并配置 Docker

国内正常工作的 Docker 镜像站越来越少了, 导致配 Docker 环境也越来越痛苦了. 于是自然想到可以利用 VPN 给 Docker 做一个代理, 具体方法如下.

打开代理软件的这个设置:

找到代理软件的端口, 我用的 FlClash 端口号是 7890, 需要在防火墙新建一条规则放行入站.

(其实这一步理论上不做也行, 可以先跳过, 出问题了再回头试试.)

可以直接在管理员 PowerShell 里运行:

New-NetFirewallRule -DisplayName "Allow WSL Proxy 7890" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 7890

或者 Win+R 打开 wf.msc, 入站规则 - 新建规则 - 端口 - TCP - 本地端口输入 7890 - 允许连接, 然后一路下一步.

然后 Win11 有一个非常好的功能, 可以让 WSL 直接和 Windows 共享网络配置.

在用户文件夹 (例如 C:\Users\用户名, 如果找不到可以 Win+R 输入 %USERPROFILE%) 新建一个名叫 .wslconfig 的文件, 内容为:

[wsl2]
networkingMode=mirrored

然后 wsl --shutdown 重启 WSL.

在 WSL 的终端运行:

export http_proxy="http://127.0.0.1:7890"
export https_proxy=$http_proxy
export HTTP_PROXY=$http_proxy
export HTTPS_PROXY=$http_proxy

即可.

想测试可以运行 curl https://www.google.com, 有正常响应就是成功了, 如果很长时间没反应大概率是寄了.

需要关掉代理的时候, 运行:

unset HTTP_PROXY HTTPS_PROXY NO_PROXY http_proxy https_proxy no_proxy

注意, 如果需要 sudo 执行某个需要代理的程序, 要带上 -E 参数, 否则 sudo 默认不会传递环境变量, 例如:

sudo -E ./installer

Docker 配置需要在终端执行:

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf

写入:

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"

然后重启 Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

即可.