WSL2 中 Docker 无法拉取镜像(TLS handshake timeout)解决方案
解决 WSL2 环境下 Docker pull 镜像时报 TLS handshake timeout 的问题
WSL2 中 Docker 无法拉取镜像(TLS handshake timeout)解决方案
目的
解决在 WSL2 环境中执行 docker pull 时出现 TLS handshake timeout,无法拉取镜像的问题。
环境前提
- Windows + WSL2
- 已开启代理(如 Clash / v2ray / sing-box)
- WSL 内可以访问外网(如
curl正常) - Docker 已安装在 WSL 中
问题表现
执行:
1
docker pull mongo:8.0
报错:
1
2
failed to resolve reference "docker.io/library/mongo:8.0":
net/http: TLS handshake timeout
核心原因
Docker daemon 不会继承 shell 中的代理环境变量,导致:
curl可以访问外网(走代理)docker pull无法访问(未走代理)
解决步骤
1. 创建 Docker 代理配置目录
1
sudo mkdir -p /etc/systemd/system/docker.service.d
2. 配置 HTTP / HTTPS 代理
1
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
写入:
1
2
3
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7897"
Environment="HTTPS_PROXY=http://127.0.0.1:7897"
说明:
127.0.0.1:7897为本地代理端口,根据实际代理软件调整- 必须使用 HTTP 代理格式
3. 重新加载并重启 Docker
1
2
3
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart docker
4. 验证代理是否生效
1
systemctl show --property=Environment docker
输出中应包含:
1
2
HTTP_PROXY=http://127.0.0.1:7897
HTTPS_PROXY=http://127.0.0.1:7897
5. 测试拉取镜像
1
docker pull mongo:8.0
若成功开始下载镜像,说明问题已解决。
使用方式
后续正常使用 Docker 命令即可,例如:
1
2
docker pull ubuntu
docker run -it ubuntu bash
无需额外配置。
补充说明
- 若代理端口变化,需要同步修改配置文件并重启 Docker
- 若使用 TUN 模式代理,建议确保本地代理端口对 WSL 可访问
- 该方法适用于所有 Docker 网络访问问题(如超时、连接失败等)
总结
通过为 Docker daemon 单独配置代理,使其网络请求走本地代理,从而解决 WSL2 环境下无法拉取镜像的问题。
本文由作者按照 CC BY 4.0 进行授权