目 录 CONTENT

文章目录

docker 更改代理拉取镜像

兜兜管理员
2024-09-26 / 0 评论 / 0 点赞 / 92 阅读 / 2752 字
温馨提示:
本文最后更新于 2025-01-03,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

在 docker 拉取镜像时,遇到 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) 报错,分析这个错误表明 Docker 无法访问 Docker 镜像仓库 https://registry-1.docker.io/v2/,而且已经尝试通过代理来解决网络访问问题,但依然遇到了超时问题 (i/o timeout)。虽然已经开启代理,但 docker-compose 和 Docker Daemon 并不会自动继承你通过 export 设置的代理环境变量,因此你需要显式地为 Docker Daemon 配置代理。

开启 docker 代理

1. 确保代理配置适用于 Docker Daemon

docker-compose 和 Docker Daemon 并不会自动继承你通过 export 设置的代理环境变量,因此你需要显式地为 Docker Daemon 配置代理。

步骤:

编辑 Docker Daemon 配置文件 /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

添加以下内容(根据你的代理配置进行调整):

[Service] 
Environment="HTTP_PROXY=http://127.0.0.1:7890" 
Environment="HTTPS_PROXY=http://127.0.0.1:7890" 
Environment="NO_PROXY=localhost,127.0.0.1"

保存并退出编辑器。

然后,重新加载 Docker 的 systemd 配置并重启 Docker 服务:

sudo systemctl daemon-reload 
sudo systemctl restart docker

2. 设置 Docker CLI 的代理

除了 Docker Daemon,你也可以为 docker-compose 和 Docker CLI 设置代理。编辑 Docker 的全局配置文件 /etc/docker/daemon.json,以便 Docker CLI 使用代理。

sudo nano /etc/docker/daemon.json

在文件中添加代理设置:

{
  "proxies": {
    "default": {
      "httpProxy": "http://127.0.0.1:7890",
      "httpsProxy": "http://127.0.0.1:7890",
      "noProxy": "localhost,127.0.0.1"
    }
  }
}

保存并退出编辑器,然后重启 Docker:

sudo systemctl restart docker

3. 使用 Docker 镜像加速器

现在的内地网络环境是无法直接访问 Docker Hub,也可以使用 Docker 官方或第三方镜像加速器。例如,如果你在中国大陆,可以使用 Docker 提供的中国区加速镜像源。

修改 /etc/docker/daemon.json 文件,添加加速器配置:

sudo nano /etc/docker/daemon.json

添加以下内容:

{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "https://mirror.ccs.tencentyun.com"
  ]
}

保存文件后,重新启动 Docker:

sudo systemctl restart docker

这样,Docker 将通过加速器访问镜像,绕过网络限制。

4. 检查代理连接

确保 Clash 或其他代理服务已经正确配置并运行。通过以下命令测试网络连接是否通过代理正常工作:

curl -x http://127.0.0.1:7890 https://registry-1.docker.io/v2/

如果输出正常,则说明代理设置有效。如果代理设置有问题,可能需要检查 Clash 的配置。

5. 避免防火墙和 DNS 问题

有时,防火墙可能会阻止 Docker 的网络连接。你可以尝试临时关闭防火墙来排除这个问题:

sudo ufw disable

也可以在 Docker 的 daemon.json 文件中添加自定义的 DNS 服务器,例如 Google 的 8.8.8.8

{
  "dns": ["8.8.8.8"]
}

保存并重启 Docker 后,再次尝试拉取镜像。

总结

通过上述步骤,你可以确保 Docker Daemon 正确使用代理并避免网络超时问题。代理配置和镜像加速器可以帮助你顺利访问 Docker Hub 或镜像仓库。如果问题依旧,建议检查代理服务的连通性以及网络环境是否有进一步的限制。

关闭 docker 代理

要关闭 Docker 的代理设置,可以按以下步骤进行操作:

1. 移除 Docker Daemon 的代理配置

如果你已经为 Docker Daemon 设置了代理配置,那么需要移除该配置文件或注释掉代理相关的行。

具体步骤:

编辑代理配置文件 /etc/systemd/system/docker.service.d/http-proxy.conf

sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf

注释掉或删除与 HTTP_PROXYHTTPS_PROXY 相关的行:

# [Service] 
# Environment="HTTP_PROXY=http://127.0.0.1:7890" 
# Environment="HTTPS_PROXY=http://127.0.0.1:7890" 
# Environment="NO_PROXY=localhost,127.0.0.1"

保存并退出编辑器,然后重新加载 systemd 并重启 Docker:

sudo systemctl daemon-reload 
sudo systemctl restart docker

2. 移除 Docker 的全局代理配置

如果你还在 /etc/docker/daemon.json 文件中设置了代理,也需要将该代理配置移除。

步骤:

编辑 Docker 的全局配置文件 /etc/docker/daemon.json

sudo nano /etc/docker/daemon.json

删除或注释掉代理相关的配置内容:

{
  "proxies": {
    "default": {
      "httpProxy": "",
      "httpsProxy": "",
      "noProxy": ""
    }
  }
}

或者直接删除 proxies 块。

保存文件后,重新启动 Docker:

sudo systemctl restart docker

3. 验证 Docker 代理已被关闭

你可以通过以下方式验证 Docker 代理是否已成功关闭:

查看 Docker 环境变量是否不再包含代理信息:

docker info | grep -i proxy

如果不返回任何内容,说明代理已经成功移除。

尝试拉取一个 Docker 镜像,确保不会再通过代理访问:

docker pull busybox

4. 还原 docker-compose 的环境变量

如果你为 docker-compose 设置了环境变量来使用代理,你可以通过以下方式清除这些变量:

unset http_proxy 
unset https_proxy 
unset all_proxy

总结

这会在当前终端会话中移除代理设置。如果你在 .bashrc.bash_profile 中设置了这些环境变量,记得移除这些配置。

通过以上步骤,你应该已经成功关闭了 Docker 的代理配置。

0

评论区