拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Docker拉取卡死35分钟?public-image-mirror镜像加速实战:3种方法+15行同步脚本

Docker拉取卡死35分钟public-image-mirror镜像加速实战3种方法15行同步脚本【免费下载链接】public-image-mirror很多镜像都在国外。比如 gcr 。国内下载很慢需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。项目地址: https://gitcode.com/GitHub_Trending/pu/public-image-mirror你有没有被凌晨2点的CI告警惊醒过上周我的一次docker pull就卡在Pulling from界面整整35分钟gcr.io的镜像只下下来8%最后超时失败。这类镜像拉取超时不是玄学源仓库在国外网络被卡脖子。而开源项目 public-image-mirrorDaoCloud的镜像加速服务给出的解法非常直接——给镜像名加一个前缀拉取速度就回到正常水平。这篇文章把它的机制、用法和集群落地一次讲透全部给到可执行粒度。读完你能拿走5件可直接用的东西✅ 3种加速拉取的写法第一种最稳30秒上手15行Python懒加载同步脚本自己机器上就能跑Docker和Podman两套全局配置粘贴后重启即可整机生效kind和kubeadm各一条可直接粘贴的集群加速命令拉取失败时的4步自诊路径白名单→脚本→队列→闲时改3种镜像名写法30秒完成一次加速拉取别急着看原理先用起来成本最低。这个项目提供3种写法按推荐度排序方法一加前缀推荐任何你想拉的镜像前面加一层m.daocloud.io/就行# 写法1推荐加前缀适用于白名单内的所有源站 docker pull m.daocloud.io/gcr.io/google-containers/pause:3.6 # 写法2前缀替换12个常用源站可用docker.io → docker.m.daocloud.io docker pull docker.m.daocloud.io/library/nginx:alpine # 加速生效后的最小验证官方快速开始示例 docker run -d -P m.daocloud.io/docker.io/library/nginx这个方式最通用它不依赖任何人工映射配置只要镜像在 allows.txt 白名单里目前1300多行条目就能加速。方法二域名替换高频源站提供了12个可直接替换的域名把原域名第一段换掉即可docker.io →docker.m.daocloud.ioregistry.k8s.io →k8s.m.daocloud.iok8s.gcr.io 已迁移到此对应域名是 k8s-gcr.m.daocloud.iogcr.io →gcr.m.daocloud.ioghcr.io →ghcr.m.daocloud.iomcr.microsoft.com →mcr.m.daocloud.ionvcr.io →nvcr.m.daocloud.ioquay.io →quay.m.daocloud.io完整对照表见 README.md 中支持前缀替换的Registry一节。注意这些映射是人工配置的每个源站内容不同配全局镜像时不要把 docker.io 之外的站点混进 Docker 的 registry-mirrors。方法三Docker全局镜像希望本机所有 docker.io 拉取自动走加速通道把下面内容加进/etc/docker/daemon.json{ registry-mirrors: [ https://docker.m.daocloud.io ] }然后执行systemctl daemon-reload systemctl restart docker重启生效之后拉 docker.io 镜像连前缀都不用加。Podman 用户同理在/etc/containers/registries.conf里给对应location配mirror即可而且它支持 gcr.io、ghcr.io 等多个源站同时配比 Docker 灵活一档。一张图看懂懒加载缓存其实只给镜像留30天为什么加个前缀就快了项目本质是镜像仓库Mirror 懒加载不是把所有镜像提前搬过来。一次完整请求路径是这样的有4个数字必须知道它们直接决定你怎么用sha256始终与源一致镜像是忠实镜像摘要不漂移源站和加速源之间可以随时来回切缓存只保留30天超过30天没人访问会被回收再次拉取会触发重新同步。关键生产镜像建议用sha256:固定版本manifest内存缓存1小时blob缓存1分钟latest 这种tag更新后最长要1小时才能同步到新内容反过来blob刚过期后的1分钟窗口内可能撞上404队列记录只保留1小时同步任务进度可以在队列状态页查看但事后再查就无据可考了。再给一条项目维护者的实战建议拉取任务尽量放在闲时窗口——北京时间01点到07点其他时段队列非常拥挤新镜像首次同步可能要等几分钟。拿核心逻辑自己做15行Python实现懒加载同步不想依赖公共服务的话可以把懒加载这15行精简逻辑抄到自己环境里。核心思路就三步先试拉镜像地址未命中就回源海外拉取成功后把结果tag成镜像地址。import subprocess, sys def sync(image, mirrorm.daocloud.io): 懒加载同步镜像地址能直接拉到就命中否则回源海外仓库并tag结果 target f{mirror}/{image} if subprocess.run([docker, pull, target]).returncode 0: print(f✅ 命中缓存拉取完成: {target}) return True if subprocess.run([docker, pull, image]).returncode ! 0: print(f❌ 源拉取失败: 请检查白名单, filesys.stderr) return False subprocess.run([docker, tag, image, target]) print(f✅ 同步完成: {target}) return True if __name__ __main__: sys.exit(0 if sync(sys.argv[1]) else 1)用法是python sync.py gcr.io/google-containers/pause:3.6成功有2条✅路径命中/同步完成失败1条❌源拉取失败。生产上建议再进一步在内网机器部署一个带 proxy 参数的 registry:3让整个内网共享一层缓存。项目官方文档给了完整 compose 文件ttl 2160h90天用法和加前缀完全一样只是把域名换成内网地址见 docs/local-cache/README.md。两条命令改全节点镜像源集群级落地Kubernetes 场景下镜像不是单机问题。两种粘贴即用的方式# kind直接指定加速后的节点镜像一条命令起本地集群 kind create cluster --name quick --image m.daocloud.io/docker.io/kindest/node:v1.22.1 # kubeadm组件镜像统一换源无需改动yaml kubeadm config images pull --image-repository k8s.m.daocloud.io正式 kubeadm 部署则直接在 ClusterConfiguration 里写两行imageRepository: k8s.m.daocloud.iocoredns 用k8s.m.daocloud.io/coredns。想让所有新建 Pod 的镜像自动换源、一行yaml都不改README 推荐搭配 repimage Webhook在加速 Kubernetes一节。部署完✅可以在每个节点用crictl images抽查新拉取的镜像都应来自加速源。完全无外网的纯内网环境就接上一节的内网缓存方案业务侧把前缀换成内网 registry 地址即可。拉取失败先走这4步终极自诊路径为什么同一个镜像晚上能拉、白天就慢八成问题不在镜像而在这条路径上。按顺序走4步多数问题5分钟内定位查白名单镜像在不在 allows.txt 里直接跑项目自带的校验脚本bash hack/verify-allows.sh allows.txt gcr.io/google-containers/pause注意镜像名不带tag带冒号会直接判否。查不到就是不会同步需要提 Issue 申请加入。查地址格式hack/correct-image.sh能把手写的乱地址规范化比如nginx会补全成docker.io/library/nginx:latest帮你确认自己填的源到底指向哪hack/verify-image-match.sh则校验白名单文件是否干净——无冗余、无重复、可幂等。查队列失败后1小时内可在队列状态页看到任务进度队列长就等闲时窗口重试。重拉验证缓存以前能用的镜像突然404大概率是30天过期回收或1分钟的blob缓存窗口重新docker pull一次触发重同步即可。自己维护私有白名单时还可以参考 hack/fmt-image-match.sh 的做法做批量去重和格式化——这套脚本原本是维护者的工具拿来当模板完全够用。收尾加速通了之后先做3件事回顾一下public-image-mirror 用前缀 懒加载缓存把海外镜像拉取变成了接近国内源的速度全程不改代码30秒生效白名单外的镜像走 Issue 申请追求极致稳定就自建内网缓存。后续动作建议从这3个里挑固定版本生产镜像全部改成sha256:或明确tag避开 latest 的1小时同步延迟也让缓存更稳定内网缓存按 docs/local-cache/README.md 部署90天ttl的本地代理把外网依赖降到最低私有白名单流水线参考 hack/ 里的4个脚本搭自己的白名单校验与格式检查。下期将带来《内网离线镜像仓库registry:3 90天缓存完整部署指南》从单机缓存走向高可用集群。如果这篇文章帮你省下了一次CI等待时间点赞收藏关注在评论区留下你拉取过最慢的镜像我们下期验证它在不在白名单里。【免费下载链接】public-image-mirror很多镜像都在国外。比如 gcr 。国内下载很慢需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。项目地址: https://gitcode.com/GitHub_Trending/pu/public-image-mirror创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门