问题起因 & 描述
其实起因非常的简单,就是为了解决 docker pull 困难的问题。我考虑到国内的镜像网站在不断的关停,到时候指不定哪一天依靠的镜像网站挂了,所以打算一劳永逸直接做一个 WSL 的代理挂到外面去直接 pull docker.io。然后…………遇上这么糟心的事……
我首先是选择了考虑直接为 docker 配置代理,直接配置了 HTTP_PROXY 与 HTTPS_PROXY,但是结果不行;(已撤销)
尝试过同步本地时间和 WSL 的时间。
然后我看到了这一篇文章,按照它所述的方式再重新配置了一次 daemon 的代理,依然无果。(已撤销)
最后我选择了躺平,考虑为 WSL 配置代理(我管你 docker 呢,反正最终都要从 WSL 出去)有按照以下的多种方式进行配置。
-
手动找出 WSL 的 ip 为它 export 代理(HTTP_PROXY & HTTPS_PROXY)。无果。(export 为临时修改,已销毁)
-
考虑添加 ALL_PROXY, 如这一篇文章所描述的,采用脚本读取每次 WSL 的 IP 并自动为它添加代理,不过并未成功。Clash For Windows 的 Allow LAN 在此处就开启了。(脚本已删除)
-
考虑将 WSL 的网络制式从 .NAT 调整为 mirrored,并且主机开启代理。(通过更改 .wslconfig 文件实现)
终于,在最后一次,我终于配置上了代理。
有一个坑,ping 是通不了 google 的,所以选择 `curl -I google.com`
但是的但是,我的 docker 依然无法拉取!错误数据如下:
https://registry-1.docker.io/v2/
{
"errors": [
{
"code": "UNAUTHORIZED",
"message": "authentication required",
"detail": null
}
]
}
(此时我登录 docker 不会无响应而是会明确地告诉我 succeed)
尝试过各种方法,包括但不限于将 WSL 的 DNS 服务器改成 8.8.8.8,删掉 docker 重新再来等等方案,以及这个方案(TUN mode 未关闭),均无效。
我最后怀疑是不是代理的问题,我考虑在本机下了一个 docker for windows 然后打算测试一下本机 pull,然后……
问题解决
手滑点到了 restart (我真以为是重新启动程序但是它给我电脑重启了!!!我的 project 啊啊啊啊)
然后解决了
白白硬控我三天是吧 🤣🤣🤣
红温了,我讨厌 docker 😡😡😡
问题再次出现
重启电脑后,这个问题出现了,又出现了。
这一次,我甚至都没法登录了 (登录也显示 unauthorized)
最终解决方案
带着上一次的可能性,我开启了 docker desktop (主机上),然后果断地选择了 sign in,然后 wsl 里面的 docker 就随便 pull 了……
目前猜测可能是 WSL 的网络方式是镜像,因此返回的请求被主机夺走了但是实际上这个返回的结果并没有被正确的应用,同时发送之前查询的是否登陆的状态也是发送到了一个没有正确响应的本地端口(或者调用那个端口的服务)使得出现问题。
如果要进一步确认的话,可以尝试不登陆 docker desktop 而选择在主机上用 cmd 登录 docker ,再考虑用 WSL 进行 pull,如果成功就说明猜想大致正确……