☰
新手镜像拉取加速指南:DaoCloud Docker 镜像源从验证到生效
2026/9/30 6:44:48 网站建设 项目流程

新手镜像拉取加速指南:DaoCloud Docker 镜像源从验证到生效

【免费下载链接】public-image-mirror很多镜像都在国外。比如 gcr 。国内下载很慢,需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。项目地址: https://gitcode.com/GitHub_Trending/pu/public-image-mirror

部署时,一个 nginx 镜像从 docker.io 拉了两个小时还没下完。DaoCloud 镜像加速(public-image-mirror)就是为这种场景准备的:它把海外镜像仓库缓存到离国内更近的节点,作为 Docker 镜像源使用,把地址改成加速前缀就能完成镜像拉取加速。

原理一句话讲清:它是源仓库的懒加载 Mirror

它本身不"重新构建"任何镜像,只是源仓库(Registry)的 Mirror:你第一次拉取时它从源站抓取内容并缓存下来(懒加载),之后你的请求直接命中缓存,所有 sha256 与源保持一致。有两个缓存细节会影响你的体感:缓存内容只保留 30 天,过期后需要重新同步;Manifest 有 1 小时内存缓存,源站 tag 更新后要等约 1 小时才会同步新内容。

你 docker pull | v m.daocloud.io ── 缓存命中 ──────────> 直接返回 | └── 未命中 ──> 回源 docker.io / gcr.io 等拉取并缓存

先验证:确认目标镜像在不在同步白名单

镜像白名单验证只需要一条命令。先克隆仓库(后面的校验脚本都在里面):

git clone https://gitcode.com/GitHub_Trending/pu/public-image-mirror cd public-image-mirror

然后用仓库自带的 hack/verify-allows.sh 检查目标镜像是否在 allows.txt 白名单中。注意传入不带 tag 的镜像地址:

./hack/verify-allows.sh allows.txt docker.io/library/nginx # 退出码为 0(无报错输出)= 已被白名单覆盖

allows.txt 的规则用通配符表达:docker.io/*表示该层级,**表示其下所有子路径。以 nginx 为例,它作为docker.io/library/nginx明确在列,可以放心加速。

把 docker.io 地址换成加速地址

地址转换有两种方式,推荐第一种(加前缀),对任何源站都成立:

docker.io/library/nginx:alpine | v m.daocloud.io/docker.io/library/nginx:alpine # 推荐:加前缀 | v docker.m.daocloud.io/library/nginx:alpine # 备选:专用域名前缀替换

换完地址后,任何命令都不用改,直接拉就行:

docker run -d -P m.daocloud.io/docker.io/library/nginx

前缀替换的专用域名按源站区分(k8s.gcr.io 已迁移到 registry.k8s.io,对应 k8s.m.daocloud.io):

源站替换为
docker.iodocker.m.daocloud.io
gcr.iogcr.m.daocloud.io
ghcr.ioghcr.m.daocloud.io
registry.k8s.iok8s.m.daocloud.io
quay.ioquay.m.daocloud.io

按你的运行环境选一条路

你用的是哪种运行时或流水线?下面每条都只给最小改动点。

本机 Docker

编辑/etc/docker/daemon.json,然后重启 Docker:

{ "registry-mirrors": ["https://docker.m.daocloud.io"] }

注意:registry-mirrors只对 docker.io 生效,不要把 gcr.io 等其他源站配到这里。

Kubernetes 集群(K8s 镜像加速配置)

两种方式:直接改工作负载的 image 字段:

containers: - name: node-exporter image: m.daocloud.io/docker.io/prom/node-exporter:v1.8.2

或者加速 kubeadm 初始化,在 ClusterConfiguration 里把imageRepository指向k8s.m.daocloud.io:

kind: ClusterConfiguration imageRepository: k8s.m.daocloud.io

Containerd

按官方 hosts 格式,为 docker.io 增加一个 host 即可:

# /etc/containerd/certs.d/docker.io/hosts.toml server = "https://registry-1.docker.io" [host."https://docker.m.daocloud.io"] capabilities = ["pull", "resolve"]

CI/CD 流水线

在流水线里定义一个前缀变量,所有拉取引用统一拼接,切换源只改一处:

variables: MIRROR: m.daocloud.io script: - docker pull ${MIRROR}/docker.io/prom/node-exporter:v1.8.2

怎么确认加速真的生效(一个可观测动作)

对同一个镜像分别计时拉取,对比耗时与摘要:

time docker pull m.daocloud.io/docker.io/library/nginx:alpine

两个判断依据:一是耗时从直接连源站的数十分钟降到秒级(首次未命中缓存时需要回源,会慢一些,属正常);二是拉取后执行docker images --digests,显示的 digest 应与从源仓库直接拉取该 tag 得到的一致——digest 相同说明你拿到的就是源站那份内容,而不是过期或错位的缓存。

没生效?对照这 4 个高频原因

第一,我把 docker.m.daocloud.io 配进了 registry-mirrors,但拉 gcr.io 的镜像还是慢。Docker 的registry-mirrors只对 docker.io 生效,且每个源站内容不同,其他源站必须走加前缀或专用域名方式(如 gcr.m.daocloud.io),不能混配。

第二,我拉了 latest 却拿到旧版本。latest 是可变 tag,Manifest 内存缓存 1 小时,源站更新后要等约 1 小时才同步,期间旧数据优先响应。建议用@sha256:摘要固定镜像,其次用明确版本号,最后才考虑 latest。

第三,拉取中途报 404。缓存内容只保留 30 天,过期后需要重新同步;Blob 还有 1 分钟内存缓存,如果这期间该 blob 到 30 天期限被删除,就会报 404。稍等片刻重试即可。

第四,白天拉取慢、凌晨拉取快。服务在白天时段比较拥挤,可以把拉取任务放在闲时(北京时间 01:00-07:00)执行,体感差异明显。

进阶:内网缓存与批量场景

如果你的环境是内网、或要批量管理镜像地址,两个方向可以参考:

  • 部署内网缓存:在内部署一个本地 registry 作为 m.daocloud.io 的缓存代理,减少对外网依赖,见 docs/local-cache/README.md。
  • 地址与白名单处理脚本(均在 hack/ 下):correct-image.sh 把不完整的镜像名补全为标准形式(如nginx→docker.io/library/nginx:latest),fmt-image-match.sh 用于精简白名单中的冗余规则,配合前面的 verify-allows.sh 使用。

一句话总结:确认白名单、改地址前缀、验证 digest 一致——DaoCloud 镜像加速的全部流程就这三步。涉及的文件:allows.txt(同步白名单)、hack/(校验脚本)、docs/local-cache/README.md(内网缓存文档)。

【免费下载链接】public-image-mirror很多镜像都在国外。比如 gcr 。国内下载很慢,需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。项目地址: https://gitcode.com/GitHub_Trending/pu/public-image-mirror

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询