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