docker pull设置proxy

539 阅读5分钟

环境信息

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

image.png

其中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.d

      • sudo: 以管理员权限运行命令。
      • 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.conf

      • sudo 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_proxyhttp:// 开头,这里也正确地将其设置在 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

image.png

参考资料

www.cnblogs.com/Chary/p/180…