(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 代理是解决方案。