新手镜像拉取加速指南: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.io | docker.m.daocloud.io |
| gcr.io | gcr.m.daocloud.io |
| ghcr.io | ghcr.m.daocloud.io |
| registry.k8s.io | k8s.m.daocloud.io |
| quay.io | quay.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.ioContainerd
按官方 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),仅供参考