开启系统代理下无法拉取 Docker 镜像的问题

我使用的是 Windows + Docker Desktop + WSL。

我无法在开启系统代理的情况下拉取镜像,提示 proxyconnect tcp: dial tcp 127.0.0.1:7890: connect: connection refuse。指向了系统代理。

我进行了一些测试,详见附件 PDF。发现只能在关闭系统代理,配置 Docker Destop 镜像源的情况下才能拉取。此时再开启系统代理,也没有问题。但 Windows 会提示系统代理发生变化,需要重启 WSL。

想请教一下如何在系统代理开启的情况下,(+不配置镜像源的下?)拉取镜像。

指教了!

Docker Issue.pdf (3.8 MB)

4 个赞

你在发行版里也装了 docker 吗
按照官方文档的说明

Important

To avoid any potential conflicts with using WSL 2 on Docker Desktop, you must uninstall any previous versions of Docker Engine and CLI installed directly through Linux distributions before installing Docker Desktop.

你应该在安装 Docker Desktop 前卸载发行版中的 docker

2 个赞

说那么多就问你
curl -x http://127.0.0.1:7890 -I https://registry-1.docker.io/v2/

通不通。Docker Destop WSL集成是在独立WSL实例运行的,不受Windows和自用的WSL的环境变量影响

2 个赞

是的,好像是自带的(忘记了…)我先暂时不删看看其他人的评论。

另外我从另一个帖子 小白解决docker网络问题姿势 - #6,来自 delphls 里看到了不需要配置镜像就可以,只需要全局代理即可。但我开启了全局代理后和启用了虚拟网卡,拉取镜像仍指向的是系统代理。

2 个赞

你好,是通的

➜  backend git:(main) ✗ curl -x http://127.0.0.1:7890 -I https://registry-1.docker.io/v2/
HTTP/1.1 200 Connection established

HTTP/1.1 401 Unauthorized
content-type: application/json
docker-distribution-api-version: registry/2.0
www-authenticate: Bearer realm="https://auth.docker.io/token",service="registry.docker.io"
date: Thu, 01 May 2025 08:25:15 GMT
content-length: 87
strict-transport-security: max-age=31536000
2 个赞

进入docker 的wsl实例容器测试

1 个赞

唔,不好意思有点不太理解。是像这样嘛?

1 个赞

是,安装curl。
或者你可以试试不使用 localhost,而是 http://你的Windows主机名.mshome.net:7890 作为docker 的 HTTP_PORXY 变量

1 个赞

多谢指点。我尝试拷贝 curl 二进制文件到 wsl 中的 docker-desktop 但貌似执行不了。另外我配置了 docker-desktop 中的代理,仍然拉取不了镜像。

1 个赞

拷贝是什么鬼,我记得docker desktop 装的发行版好像是 Fedora ,dnf install curl

似乎不太行…

PS C:\Users\hiron> wsl -d docker-desktop
docker-desktop:/tmp/docker-desktop-root/run/desktop/mnt/host/c/Users/hiron# dnf install curl
-sh: dnf: not found
docker-desktop:/tmp/docker-desktop-root/run/desktop/mnt/host/c/Users/hiron# cat /etc/os-release
PRETTY_NAME="Docker Desktop"
docker-desktop:/tmp/docker-desktop-root/run/desktop/mnt/host/c/Users/hiron# lsb_release -a
-sh: lsb_release: not found
docker-desktop:/tmp/docker-desktop-root/run/desktop/mnt/host/c/Users/hiron# hostnamectl
-sh: hostnamectl: not found
docker-desktop:/tmp/docker-desktop-root/run/desktop/mnt/host/c/Users/hiron# apt
-sh: apt: not found
docker-desktop:/tmp/docker-desktop-root/run/desktop/mnt/host/c/Users/hiron# yum
-sh: yum: not found
docker-desktop:/tmp/docker-desktop-root/run/desktop/mnt/host/c/Users/hiron#

cat /etc/os-release 看看

图中已执行,结果为:

PRETTY_NAME="Docker Desktop"

虽然不知道你们在干嘛,但建议把系统代理关掉,虚拟网卡开启,规则里加一条:

- DOMAIN-SUFFIX,docker.io,YOUR_PROXY


突然发现,怎么没写这个。实在不行,就 TUN 吧,最简单,也不用考虑其他

1 个赞

已解决,多谢大佬们的指点!目前配置如下:

关闭系统代理,启用虚拟网卡(之前对这块完全不了解)。不需要添加规则。

启用 docker-desktop 集成 WSL,关闭代理,不需要添加镜像。

成功拉取镜像。 :nerd_face:

3 个赞

已解决,多谢大佬指点!

已解决,多谢大佬指点!

你这里不需要加规则,大概是因为你的配置里已经囊括了相关的 docker 规则,或者能正确解析到相关域名的 IP,但加一下规则总归是更有保障的… 有空可以维护一份自己的规则。

科普一下系统代理和虚拟网卡(TUN):

  • 系统代理:应用自适应,流量是否经过代理是应用说了算,例如浏览器就必用系统代理;
  • 虚拟网卡:强制大部分应用的流量经过代理。

这俩基本不需要同时启用,按需选择。最后规则模式下,应用或域名是否能使用代理服务,就是规则说了算。 :smiley:

有虚拟网卡之后就不需要开全局了,规则应该就可以