在 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
,以配置代理。
添加以下内容(根据你的代理配置进行调整):
保存并退出编辑器。
然后,重新加载 Docker 的 systemd 配置并重启 Docker 服务:
2. 设置 Docker CLI 的代理
除了 Docker Daemon,你也可以为 docker-compose
和 Docker CLI 设置代理。编辑 Docker 的全局配置文件 /etc/docker/daemon.json
,以便 Docker CLI 使用代理。
在文件中添加代理设置:
保存并退出编辑器,然后重启 Docker:
3. 使用 Docker 镜像加速器
现在的内地网络环境是无法直接访问 Docker Hub,也可以使用 Docker 官方或第三方镜像加速器。例如,如果你在中国大陆,可以使用 Docker 提供的中国区加速镜像源。
修改 /etc/docker/daemon.json
文件,添加加速器配置:
添加以下内容:
保存文件后,重新启动 Docker:
这样,Docker 将通过加速器访问镜像,绕过网络限制。
4. 检查代理连接
确保 Clash 或其他代理服务已经正确配置并运行。通过以下命令测试网络连接是否通过代理正常工作:
如果输出正常,则说明代理设置有效。如果代理设置有问题,可能需要检查 Clash 的配置。
5. 避免防火墙和 DNS 问题
有时,防火墙可能会阻止 Docker 的网络连接。你可以尝试临时关闭防火墙来排除这个问题:
也可以在 Docker 的 daemon.json
文件中添加自定义的 DNS 服务器,例如 Google 的 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
:
注释掉或删除与 HTTP_PROXY
和 HTTPS_PROXY
相关的行:
保存并退出编辑器,然后重新加载 systemd 并重启 Docker:
2. 移除 Docker 的全局代理配置
如果你还在 /etc/docker/daemon.json
文件中设置了代理,也需要将该代理配置移除。
步骤:
编辑 Docker 的全局配置文件 /etc/docker/daemon.json
:
删除或注释掉代理相关的配置内容:
或者直接删除 proxies
块。
保存文件后,重新启动 Docker:
3. 验证 Docker 代理已被关闭
你可以通过以下方式验证 Docker 代理是否已成功关闭:
查看 Docker 环境变量是否不再包含代理信息:
如果不返回任何内容,说明代理已经成功移除。
尝试拉取一个 Docker 镜像,确保不会再通过代理访问:
4. 还原 docker-compose
的环境变量
如果你为 docker-compose
设置了环境变量来使用代理,你可以通过以下方式清除这些变量:
总结
这会在当前终端会话中移除代理设置。如果你在 .bashrc
或 .bash_profile
中设置了这些环境变量,记得移除这些配置。
通过以上步骤,你应该已经成功关闭了 Docker 的代理配置。
评论区