Docker拉取镜像部分成功部分失败的解决方案

 更新时间:2025年05月28日 10:33:20   作者:mr.Darker  
最近在部署 Zitadel 身份认证平台的过程中,遇到一个看似“随机”的问题:Docker 有些镜像可以拉取,有些却一直超时失败,最终通过配置 Docker 守护进程级别的代理 才解决,文章记录整个问题分析和解决过程,便于自己和大家后期参考,需要的朋友可以参考下

 问题背景

部署 Zitadel 时,使用官方提供的 getting-started-with-zitadel.sh 脚本,脚本会拉取多个 Docker 镜像,比如:

  • ghcr.io/zitadel/zitadel
  • docker.io/library/caddy
  • netbirdio/** 等

问题表现

在执行过程中,有些镜像可以拉取成功,有些会报如下错误:

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)

观察结果是:

镜像是否拉取成功
ghcr.io/zitadel/zitadel✅ 成功
docker.io/library/caddy✅ 成功
netbirdio/management / netbirdio/signal❌ 超时失败

同时,我们很早就配置了一些 Docker Hub 镜像加速器(如阿里云,腾讯云,DaoCloud 等),这也是为什么有些镜像能顺利拉取,有些却不能的原因之一。

因为镜像加速器仅能加速“Docker Hub 官方镜像”,如 library/nginx 或 docker.io/library/caddy,而像 netbirdio/* 这种非官方项目的镜像并不在加速器白名单内,因此仍然会拉取失败。

初步排查

网络本身没有问题

  • ping registry-1.docker.io 正常
  • curl https://registry-1.docker.io/v2/ 正常
  • docker login 也没有任何异常

但 Docker 拉取仍旧失败

通过多次测试发现,Docker 有些镜像拉得飞快,有些镜像卡死或超时,尤其是 docker.io/netbirdio 相关的镜像。

这时开始怀疑:

可能和代理有关

解决思路:配置 Docker 的守护进程代理

平时我们习惯配置终端代理,例如:

export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890

但实际上:

Docker 守护进程(dockerd)是独立运行的,它不会继承当前 shell 的代理环境变量!

解决方案:配置 Docker 的 systemd 代理

  • 创建代理配置目录(如不存在):
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,.corp"
  • 应用配置并重启 Docker:
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart docker
  • 验证代理是否生效:
sudo systemctl show --property=Environment docker

输出应该包含你刚才设置的代理环境变量。

最终结果

重启 Docker 后再次运行部署脚本:

  • 所有镜像(包括 netbirdio)都能成功拉取
  • 部署流程顺利走完

总结

问题结论
Docker 部分镜像拉取失败是由于 Docker 守护进程未配置代理,而不是网络本身问题
解决方案配置 systemd 层面的 http-proxy.conf,让 dockerd 使用代理
验证方式systemctl show --property=Environment docker 查看生效状态

经验教训

  • Docker CLI 和 Docker 守护进程环境是 两套东西,网络设置互不影响
  • 如果你使用代理加速访问 Docker Hub,务必同步设置到 系统服务级别
  • 部署复杂服务时,像 Zitadel 这类一键脚本可能集成很多镜像,尽早配置好代理 可避免不必要的卡顿
  • 配置镜像加速器虽然有用,但仅限于部分镜像。像 netbirdioghcr.io 上的镜像,加速器是无法覆盖的,因此守护进程代理是更通用的做法
  • Docker 官方解决文档

以上就是Docker拉取镜像部分成功部分失败的解决方案的详细内容,更多关于Docker拉取镜像部分成功部分失败的资料请关注脚本之家其它相关文章!

相关文章

  • Docker连接宿主Redis的方法步骤

    Docker连接宿主Redis的方法步骤

    本文主要介绍了Docker连接宿主Redis的方法步骤,可以轻松地使用Docker容器与宿主机上的Redis进行交互,实现高效的数据存储和共享,,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • docker部署nginx及nginx.conf文件配置方式

    docker部署nginx及nginx.conf文件配置方式

    这篇文章主要介绍了docker部署nginx及nginx.conf文件配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 你可能不知道的docker命令奇怪巧

    你可能不知道的docker命令奇怪巧

    这篇文章主要介绍了你可能不知道的docker命令的奇怪巧,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • Docker中优化Mysql运行内存的操作

    Docker中优化Mysql运行内存的操作

    这篇文章主要介绍了Docker当中优化Mysql运行内存的操作,经过一番操作可以优化为只占用100mb内存,具体优化方法及技巧跟随小编一起看看吧
    2022-01-01
  • 利用docker搭建php7和nginx运行环境全过程(官方镜像)

    利用docker搭建php7和nginx运行环境全过程(官方镜像)

    docker提供了在服务端分布式的部署应用,这样的好处是方便维护和升级。下面这篇文章主要给大家介绍了利用docker搭建php7和nginx运行环境的相关资料,搭建过程中运用的是官方镜像,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-05-05
  • Docker端口映射的实现

    Docker端口映射的实现

    这篇文章主要介绍了Docker端口映射的实现,详细的介绍了五种端口的映射方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • 如何使用docker对容器资源进行限制

    如何使用docker对容器资源进行限制

    这篇文章主要介绍了如何使用docker对容器资源进行限制,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • docker-registry使用笔记

    docker-registry使用笔记

    在国内docker-hub是肯定用不了的,不解释:所以最好还是建一个私有的docker-registry,存储一些常用的images方便随时pull
    2016-09-09
  • docker中运行PostgreSQL容器的简单步骤

    docker中运行PostgreSQL容器的简单步骤

    这篇文章主要给大家介绍了关于docker中运行PostgreSQL容器的简单步骤,随着docker的广泛应用,为了提供便利的管理,PostgreSQL数据库也支持docker的安装方式,需要的朋友可以参考下
    2023-08-08
  • Docker将镜像文件发布到阿里云的详细过程

    Docker将镜像文件发布到阿里云的详细过程

    这篇文章主要介绍了Docker将镜像文件发布到阿里云的操作,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05

最新评论