计算机技术 · 2025年4月13日

WSL 安装 Docker 并配置 clash 代理

本文主要介绍以 WSL 形式运行的Ubuntu 22.04 LTS 下安装 docker 并通过宿主机的 clash 代理访问外网的配置流程。

WSL 网络配置

首先编辑 ~/.wslconfig ,将网络模式设置为 mirrored ,并关闭 dnsTunneling

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

Clash-verge 配置

在 clash 的设置中启用局域网连接,点击 局域网连接 旁边的小图标可以看到宿主机的本地 IP ,本文以 192.168.8.176 这个 IP 为例,在其他环境下设置时注意替换为自己的本地 IP. 在下面端口一栏可以看到 clash 代理的默认服务端口 7897

开启 mirrored 模式后,进入 WSL 中查看到的IP和宿主机IP相同

使用这个 IP ,以及 clash 的服务端口 7897 ,编辑 ~/.bashrc 添加环境变量:

host_ip=192.168.8.176
export http_proxy="http://$host_ip:7897"
export https_proxy="http://$host_ip:7897"

保存后执行 source ~/.bashrc 使环境变量设置生效。

APT 安装 Docker

接下来准备安装 Docker 相关组件。在正式安装 Docker 引擎之前,需要卸载任何可能冲突的软件包。

for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

设置 Docker 的 APT 仓库

然后,需要设置 Docker 的 APT 仓库。之后,可以从该仓库安装和更新 Docker。

# 添加 Docker 的官方 GPG 密钥:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# 将仓库添加到 Apt 源列表:
echo \
 "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
 $(lsb_release -cs) stable" | \
 sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

安装 Docker

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装完成后拉取并运行 hello-world 镜像验证安装是否成功:

sudo docker run hello-world

Dockerd 代理配置

如果拉取镜像时报错,说明需要给 docker daemon 另外配置代理:

zzm@DESKTOP-D4196DQ:~$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
  1. 创建目录 sudo mkdir -p /etc/systemd/system/docker.service.d
  2. 新建配置文件 /etc/systemd/system/docker.service.d/http-proxy.conf,这个文件中将包含环境变量:
[Service]
Environment="HTTP_PROXY=http://192.168.8.176:7897"
Environment="HTTPS_PROXY=http://192.168.8.176:7897"

重启服务使新配置生效:

sudo systemctl daemon-reload
sudo systemctl restart docker

检查确认环境变量已经正确配置:

sudo systemctl show --property=Environment docker

容器代理配置

镜像启动后如果要在容器中使用代理,需要在启动时通过 --env 选项指定 HTTP_PROXY 环境变量或者在 ~/.docker/config.json 中添加默认的代理设置。

  1. --env 选项
docker run --env HTTP_PROXY="http://<user>:<password>@<domain>:<port>" <some-image>
  1. config.json 配置
{
 "auths": {
   "..."
},
 "proxies": {
   # 通用配置,会对当前客户端连接的所有Docker服务生效
   "default": {
     "httpProxy": "http://192.168.8.176:7897",
     "httpsProxy": "http://192.168.8.176:7897",
     "noProxy": "*.test.example.com,.example.org,127.0.0.0/8"
  }
}
}

运行成功后通过下面的命令验证相关环境变量是否符合预期:

docker run --rm alpine sh -c 'env | grep -i  _PROXY'

参考资料

Ubuntu | Docker Docs

如何优雅的给 Docker 配置网络代理 – CharyGao – 博客园

书包是笨蛋

Just for fun.