(base) shgbitai@shgbitai-C9X299-PGF:~/tools$ curl -x http://127.0.0.1:1080 https://registry-1.docker.io/v2/
curl: (56) Proxy CONNECT aborted
(base) shgbitai@shgbitai-C9X299-PGF:~/tools$ curl -x https://127.0.0.1:1080 https://registry-1.docker.io/v2/
curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to 127.0.0.1:1080
(base) shgbitai@shgbitai-C9X299-PGF:~/tools$ curl -x socks5h://127.0.0.1:1080 https://registry-1.docker.io/v2/
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":null}]}
(base) shgbitai@shgbitai-C9X299-PGF:~/tools$ docker pull redis
Using default tag: latest
Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
(base) shgbitai@shgbitai-C9X299-PGF:~/tools$
-
Socks5 代理工作正常:
- 使用
curl -x socks5h://127.0.0.1:1080时,连接到 Docker 注册表的请求成功返回了UNAUTHORIZED错误。这是预期的,因为需要身份验证才能访问该资源。这表明 Socks5 代理正常工作。
- 使用
-
Docker 拉取镜像失败:
- 在你尝试使用
docker pull redis时,出现了context deadline exceeded错误。这意味着 Docker 客户端无法成功通过代理连接到 Docker 注册表。
这是因为 Docker 不直接支持 Socks5 代理,它只支持 HTTP/HTTPS 代理。你需要将 Docker 配置为使用 HTTP 代理,并且可以通过一种工具来把 Socks5 转换成 HTTP 代理。
- 在你尝试使用
解决问题的步骤:
1. 安装 privoxy 将 Socks5 转换为 HTTP 代理
由于 Docker 不支持直接使用 Socks5 代理,你可以使用 privoxy 工具将 Socks5 代理转换为 HTTP 代理。以下是步骤:
-
安装
privoxy:sudo apt update sudo apt install privoxy -
配置
privoxy使用 Socks5 代理:
打开privoxy配置文件:sudo nano /etc/privoxy/config在文件末尾添加以下内容,配置
privoxy使用127.0.0.1:1080作为 Socks5 代理:forward-socks5t / 127.0.0.1:1080 . -
保存并重启
privoxy:
保存配置文件后,重启privoxy服务:sudo systemctl restart privoxy现在,
privoxy应该会监听 HTTP 请求,并将其转发到 Socks5 代理。
2. 配置 Docker 使用 privoxy 提供的 HTTP 代理
接下来,你需要将 Docker 配置为使用 privoxy 提供的 HTTP 代理。默认情况下,privoxy 在端口 8118 监听 HTTP 请求。
-
配置 Docker 代理:
创建或编辑 Docker 的守护进程配置文件/etc/systemd/system/docker.service.d/http-proxy.conf:sudo mkdir -p /etc/systemd/system/docker.service.d sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf添加以下内容,将代理设置为
privoxy提供的 HTTP 代理:[Service] Environment="HTTP_PROXY=http://127.0.0.1:8118/" Environment="HTTPS_PROXY=http://127.0.0.1:8118/" -
重启 Docker:
保存文件后,重启 Docker 服务使更改生效:sudo systemctl daemon-reload sudo systemctl restart docker -
验证配置:
你可以通过以下命令检查 Docker 是否正确应用了代理设置:docker info | grep -i proxy如果配置正确,你应该能看到
HTTP_PROXY和HTTPS_PROXY的设置。
3. 重新尝试拉取镜像
现在,代理配置已经完成,你可以尝试再次拉取 Docker 镜像:
docker pull redis
这次应该能够通过 privoxy 代理来连接到 Docker 注册表并成功拉取镜像。
总结:
- Socks5 代理 可以通过
curl测试正常工作。 - Docker 直接使用 Socks5 代理是不可行的,因此通过
privoxy将 Socks5 代理转换为 HTTP 代理,并让 Docker 使用 HTTP 代理是解决方案。
