环境信息
ubuntu24.04虚拟机(在mac m1宿主机上通过pd运行)
错误信息
执行docker run,docker login,docker pull等任意命令,报错如下,一般就是proxy问题。
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
处理1:ubuntu虚拟机设置宿主机的proxy
Settings->Network->Proxy
其中ip(192.168.1.6)是宿主机ip.
验证系统proxy配置ok: 包括浏览器和命令行
- 浏览器访问
https://registry-1.docker.io/v2/,链接可以建立,但是返回错误UNAUTHORIZED
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":null}]}
-
命令行
curl -Iv https://registry-1.docker.io/v2/检测连通性。注意不能用ping,因为ping 使用ICMP协议。proxy只处理tcp和udp协议流量。
(base) parallels@worker:~$ curl -Iv https://registry-1.docker.io/v2/
* Uses proxy env variable no_proxy == 'localhost,,,,127.0.0.0/8,,,,::1,,,,192.168.49.2,,192.168.0.0/16'
* Uses proxy env variable https_proxy == 'http://192.168.1.6:1087/' // 具体使用的proxy
* Trying 192.168.1.6:1087...
* Connected to 192.168.1.6 (192.168.1.6) port 1087
* CONNECT tunnel: HTTP/1.1 negotiated
* allocate connect buffer
* Establish HTTP proxy tunnel to registry-1.docker.io:443
> CONNECT registry-1.docker.io:443 HTTP/1.1
> Host: registry-1.docker.io:443
> User-Agent: curl/8.5.0
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 Connection established // 连接建立,说明proxy没问题
...
此时验证浏览器和命令行proxy都ok,但是docker命令还是报错
(base) parallels@worker:~$ docker login
Log in with your Docker ID or email address to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com/ to create one.
You can log in with your password or a Personal Access Token (PAT). Using a limited-scope PAT grants better security and is required for organizations using SSO. Learn more at https://docs.docker.com/go/access-tokens/
Username: xxxxx
Password:
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
原因
如果是systemd形式启动的docker daemon,就需要额外设置proxy。 参考官网说明httphttps-proxy
处理2: 以下操作均为gpt回答,1次完美解决
1. 配置 Docker Engine (守护进程) 代理:
这将允许 Docker 守护进程在拉取镜像或访问外部网络时使用代理。
-
创建 Docker systemd 配置文件目录 (如果不存在):
Bash
sudo mkdir -p /etc/systemd/system/docker.service.d-
解释:
sudo mkdir -p /etc/systemd/system/docker.service.dsudo: 以管理员权限运行命令。mkdir -p: 创建目录命令。-p参数表示如果目录已存在则不报错,如果父目录不存在则先创建父目录。/etc/systemd/system/docker.service.d: Docker 服务的 systemd 配置文件的存放目录。 我们将在其中创建一个新的配置文件来添加代理设置。
-
-
创建名为
http-proxy.conf的配置文件在目录中:Bash
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf-
解释:
sudo nano /etc/systemd/system/docker.service.d/http-proxy.confsudo nano: 以管理员权限使用nano文本编辑器。/etc/systemd/system/docker.service.d/http-proxy.conf: 要创建的配置文件的路径和名称。http-proxy.conf是一个自定义的名称,用于存放 HTTP 代理配置。
-
-
在
http-proxy.conf文件中添加以下代理配置: 在nano编辑器中,粘贴或输入以下内容,并将<your_proxy_server>和<proxy_port>替换为您的实际代理服务器地址和端口。 如果您的代理需要身份验证,请在 URL 中包含用户名和密码。Ini, TOML
[Service] Environment="HTTP_PROXY=http://192.168.1.6:1087/" Environment="HTTPS_PROXY=http://192.168.1.6:1087/" Environment="ALL_PROXY=socks://192.168.1.6:1080/" Environment="NO_PROXY=localhost,127.0.0.1,192.168.49.2,192.168.0.0/16,::1"-
解释:
[Service]: 表示以下是 systemd 服务配置的[Service]部分。Environment="HTTP_PROXY=http://192.168.1.6:1087/": 设置 HTTP 代理为http://192.168.1.6:1087/,与您的http_proxy环境变量一致。Environment="HTTPS_PROXY=http://192.168.1.6:1087/": 设置 HTTPS 代理为http://192.168.1.6:1087/,与您的https_proxy环境变量一致。 注意: 即使您的https_proxy以http://开头,这里也正确地将其设置在HTTPS_PROXY环境变量中,供 Docker 使用。Environment="ALL_PROXY=socks://192.168.1.6:1080/": 设置 SOCKS 代理为socks://192.168.1.6:1080/,与您的all_proxy环境变量一致。 Docker 可能会在 HTTP/HTTPS 之外的协议中使用此代理(如果需要)。Environment="NO_PROXY=localhost,127.0.0.1,192.168.49.2,192.168.0.0/16,::1": 设置NO_PROXY列表,确保到localhost,127.0.0.1,192.168.49.2,192.168.0.0/16网络以及 IPv6 回环地址 (::1) 的连接将绕过代理。 我包含了您no_proxy环境变量中的所有条目,并添加了逗号作为分隔符。
-
-
保存并关闭文件: 在
nano编辑器中,按下Ctrl+X,然后按Y保存,最后按Enter确认文件名。 -
重新加载 systemd 配置并重启 Docker 服务:
Bash
sudo systemctl daemon-reload sudo systemctl restart docker-
解释:
sudo systemctl daemon-reload: 重新加载 systemd 守护进程配置,使新的配置文件生效。sudo systemctl restart docker: 重启 Docker 服务,使新的代理配置生效。
-
-
验证 Docker Engine 代理设置: 重启 Docker 后,再次运行以下命令,并检查输出结果的
Server部分是否包含Http Proxy,Https Proxy, 和All Proxy行,并显示您配置的代理设置。Bash
docker system info您应该在
Server部分看到类似以下的输出:Http Proxy: http://192.168.1.6:1087/ Https Proxy: http://192.168.1.6:1087/ All Proxy: socks://192.168.1.6:1080/ No Proxy: localhost,127.0.0.1,192.168.49.2,192.168.0.0/16,::1
2. 验证 Docker CLI 客户端代理 (Shell 环境):
根据您的 env | grep proxy 输出,您已经在当前的 shell 会话中设置了代理环境变量。 为了确保这些变量在您当前的终端会话中仍然有效,您可以重新执行 source 命令加载您的 shell 配置文件(如果您之前将环境变量设置在配置文件中),或者直接确保环境变量在当前 shell 中仍然被设置。
-
验证环境变量是否在当前 shell 中设置:
再次运行
env | grep proxy。 您应该看到http_proxy,https_proxy,all_proxy, 和no_proxy变量及其您配置的值被列出。
完成以上步骤后:
-
再次尝试登录 Docker Hub,使用命令:
Bash
docker login -
同时,尝试从 Docker Hub 拉取一个镜像,以测试代理是否在镜像下载中工作:
Bash
docker pull hello-world
最后:验证docker命令执行,比如pull镜像成功
(base) parallels@worker:~$ docker run -d -p 8080:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
d51c377d94da: Pull complete
492c7b58b293: Pull complete
587f328750b8: Pull complete
60b452932acd: Pull complete
c60ea76daae0: Pull complete
fb23ee5f039b: Pull complete
0b59f5cbcfb9: Pull complete
Digest: sha256:9d6b58feebd2dbd3c56ab5853333d627cc6e281011cfd6050fa4bcf2072c9496
Status: Downloaded newer image for nginx:latest
39456a5f2f328df08d7094b0ee799f473e2c9d59b7fa272d20ab5165a9a56bed
补充
mac m1宿主机自身的docker desktop,默认会使用system proxy,也不用配置国内镜像url,应该直接就可以拉取docker hub