镜像卡在 gcr.io 出不来?public-image-mirror 容器镜像加速实战指南
【免费下载链接】public-image-mirror很多镜像都在国外。比如 gcr 。国内下载很慢,需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。项目地址: https://gitcode.com/GitHub_Trending/pu/public-image-mirror
上周我在一台新机器上部署 Kubernetes 控制面,卡在gcr.io拉镜像这一步整整两个小时:重试超时、换网络、手动导出再导入……折腾到怀疑人生。最后同事丢给我一个方案——public-image-mirror,一个由 DaoCloud 维护的容器镜像加速项目。它的核心逻辑简单到一句话:把国外镜像仓库的地址,原样映射到国内可达的m.daocloud.io域名下。我加了个前缀再拉,同一个镜像从十几分钟变成十几秒。这篇文章就把整套玩法拆给你:从单条命令到内网缓存,从 Docker 到 Kubernetes,一次讲透。
先搞清楚一件事:它到底帮你干了什么
很多人一听"镜像加速"就想到自建代理,其实 public-image-mirror 的思路完全不一样:
- 它只是源镜像仓库(Registry)的Mirror,也就是镜像站的镜像站。
- 所有 hash(sha256)都和源保持一致,采用懒加载机制:你拉的时候它才从源同步,绝不给你造一个"变味"的镜像。
- 项目每天检查各仓库的同步情况,保证热门镜像基本实时可用。
换句话说,你不需要信任什么"第三方改编版",你拿到的还是那个官方镜像,只是运输路径变了。这一点对生产环境尤其重要——hash 对得上,安全底线就在。
选它而不是自建代理的三个理由
我知道你可能已经在想:"那我干脆自己搭个代理不行吗?" 行,但先看完这张对比再决定:
| 维度 | 自建代理 | 公共代理源 | public-image-mirror |
|---|---|---|---|
| 上手成本 | 要维护服务器和证书 | 配置即用 | 配置即用 |
| 改动量 | 要改一堆仓库地址 | 加前缀即可 | 加前缀即可 |
| 稳定性 | 取决于你的带宽 | 看运营商心情 | 每天检查同步,白名单透明 |
| 镜像一致性 | 自己保证 | 不透明 | sha256 与源一致(懒加载) |
三个理由,一个比一个实在:
- 改动最小:只是名称映射,不需要改任何代码。你的 Dockerfile、Helm、yaml 全部原样,只在地址前加前缀。
- 稳定可靠:每天自动检查同步情况,还有同步队列(
queue.m.daocloud.io/status/)和服务状态监控页面可以随时查。 - 覆盖面广:gcr.io、docker.io、quay.io、ghcr.io、registry.k8s.io、mcr.microsoft.com、nvcr.io 这些高频仓库全在支持列表里。
10 秒上手:给镜像地址加个前缀
先别想复杂了,最快的一条命令长这样:
docker run -d -P m.daocloud.io/docker.io/library/nginx原理一句话:在完整镜像地址前面,原样加上m.daocloud.io/前缀。
docker.io/library/busybox ↓ 加前缀 m.daocloud.io/docker.io/library/busybox完成这一步,你就得到了一条从国内直连、几乎不会超时的拉取链路。注意这里要写完整地址(包含docker.io/),不要自作聪明把它去掉——这正是前缀法最大的优点:规则无脑,任何镜像都能套,不怕记错映射关系。
这个方法适合所有场景:docker run、docker compose、Kubernetes 的 image 字段,甚至 CI 流水线里都能用,属于"保底方案"。
想让地址更短?试试前缀替换
如果嫌m.daocloud.io/docker.io/library/nginx太长,项目还为常见仓库准备了前缀替换的玩法,把域名直接映射成xxx.m.daocloud.io:
| 源站 | 替换为 | 备注 |
|---|---|---|
| docker.elastic.co | elastic.m.daocloud.io | |
| docker.io | docker.m.daocloud.io | |
| dhi.io | dhi.m.daocloud.io | |
| gcr.io | gcr.m.daocloud.io | |
| ghcr.io | ghcr.m.daocloud.io | |
| k8s.gcr.io | k8s-gcr.m.daocloud.io | 已迁移到 registry.k8s.io |
| registry.k8s.io | k8s.m.daocloud.io | |
| mcr.microsoft.com | mcr.m.daocloud.io | |
| nvcr.io | nvcr.m.daocloud.io | |
| quay.io | quay.m.daocloud.io | |
| registry.ollama.ai | ollama.m.daocloud.io | 实验内测中 |
用起来长这样:
docker.io/library/busybox ↓ 前缀替换 docker.m.daocloud.io/library/busybox一句话说清适用场景:图省事、想要短地址,就用替换法;图保险、不想记规则,就用前缀法,官方也是更推荐前缀法的。这里有个特别提醒:每个源站的内容都不一样,⚠️不要把 docker.io 之外的站点配到 Docker 的 registry-mirrors 里,那是给 docker.io 专用镜像加速的,配错了轻则无效、重则报错。
避开这 6 个坑,拉取成功率直接拉满
这些坑我基本都踩过,直接给你避坑清单,一条一条对:
- 挑时间拉:白天高峰很挤,把拉取任务放在凌晨(北京时间 01–07 点)会快很多,实测差距明显。⏰
- 用
@sha256:锁死镜像:优先用 digest 固定版本,其次用明确的 tag(如v1.22.1),最后才考虑latest。latest这种可变 tag 更新后,旧数据会被响应且后台要重新同步。 - 缓存只有 30 天:项目缓存的内容只保留 30 天,过期后会重新同步,冷门镜像第一次拉偏慢是正常现象。
- tag 更新有延迟:Manifest 内存缓存 1 小时,也就是说上游 tag 更新后大约 1 小时才会同步新的,别刚发布就去拉然后怀疑人生。
- 偶发 404 别慌:Blob 内存缓存只有 1 分钟,期间如果 blob 刚好到 30 天期限被删了,可能报 404,重试一般就好。
- 先确认镜像在白名单里:项目用
allows.txt维护支持列表,动手之前先看一眼你的镜像在不在里面,省得白等。
进阶:Kubernetes 全家桶一次提速到位
如果你的痛点是 Kubernetes 拉镜像慢,下面这套组合拳按需取用,都是可直接抄的配置。
kubeadm 安装控制面——改两行imageRepository即可:
apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration imageRepository: k8s.m.daocloud.io dns: imageRepository: k8s.m.daocloud.io/corednskind 创建集群——创建时直接指定加速镜像:
kind create cluster --name kind --image m.daocloud.io/docker.io/kindest/node:v1.22.1containerd——参考官方 hosts 文档配置 registry host namespace;如果你用 kubespray 装的 containerd,直接配containerd_registries_mirrors变量,一行搞定。
Docker daemon——把加速站加进全局镜像源,之后所有docker pull自动走加速:
{ "registry-mirrors": [ "https://docker.m.daocloud.io" ] }Podman——在配置文件里为多个 registry 分别声明 mirror:
[[registry]] location = "docker.io" [[registry.mirror]] location = "docker.m.daocloud.io" [[registry]] location = "gcr.io" [[registry.mirror]] location = "gcr.m.daocloud.io"Podman 有个 Docker 给不了的优势:它支持给docker.io 之外的 registry 配 mirror,gcr、ghcr、quay、registry.k8s.io 都能配,配置方式照葫芦画瓢。
企业级玩法:把加速站搬进内网
团队人多、镜像量大,公共站扛不住?那就部署一个本地缓存代理,让内网所有机器共享缓存。原理很简单:用一个带 proxy 模式的 registry,把m.daocloud.io当上游。
先写一个docker-compose.yml:
services: registry: image: m.daocloud.io/docker.io/library/registry:3 restart: unless-stopped ports: - 8888:8888 command: - /etc/docker/registry/config.yml volumes: - cache-data:/var/lib/registry configs: - source: registry-config target: /etc/docker/registry/config.yml configs: registry-config: content: | version: 0.1 storage: delete: enabled: true filesystem: rootdirectory: /var/lib/registry http: addr: :8888 proxy: remoteurl: https://m.daocloud.io ttl: 2160h volumes: cache-data: {}启动它:
docker compose up -d然后让每台机器把本地仓库加进 insecure-registries:
{ "insecure-registries": ["<your-registry-ip>:<your-registry-port>"] }重启 Docker 后,<your-registry-ip>:<your-registry-port>/就成了m.daocloud.io/的本地缓存代理。用法和加前缀一模一样:
docker pull <your-registry-ip>:<your-registry-port>/docker.io/library/nginx:latest第一个拉的人走公网,后面的全走内网缓存,速度直接起飞 🚀。这份配置在项目里有完整文档,对应源码路径是docs/local-cache/README.md,照着抄就行。
偷懒大法:Webhook 自动替换所有镜像
不想改任何 yaml、helm、Dockerfile?那就让"劫持"发生在 Pod 创建那一刻。用 repimage 这个工具部署一个 Webhook,它会自动把集群里所有新建 Pod 的 image 改写成加速地址,你的业务清单一个字都不用动:
kubectl create -f https://files.m.daocloud.io/github.com/wzshiming/repimage/releases/download/latest/repimage.yaml kubectl rollout status deployment/repimage -n kube-system注意上面这个安装地址本身就是走files.m.daocloud.io加速的,连部署工具这一步都是快的。它特别适合存量集群——尤其是那些躺着几百个旧 Deployment、一个个改 image 要改到天荒地老的老项目。
彩蛋:Ollama 和 DeepSeek 模型也能加速
最后给搞 AI 的朋友一个彩蛋。装 Ollama 同样可以走加速源,CPU 版:
docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama docker.m.daocloud.io/ollama/ollama有 GPU 就加个参数:
docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --name ollama docker.m.daocloud.io/ollama/ollama启动之后,连模型下载都能加速(DeepSeek-R1 实验内测中):
docker exec -it ollama ollama run ollama.m.daocloud.io/library/deepseek-r1:1.5b写在最后
回到开头那个场景:同样是部署 Kubernetes 控制面,现在我的流程是"给镜像地址加前缀 → 直接拉 → 几分钟进集群"。这中间差的不只是两小时,是每次碰墙之后想砸键盘的怨气。public-image-mirror 给我的感觉就是:方案足够简单,简单到你不会再想换别的。
如果你也被镜像拉取折磨过,建议直接上手试一条命令,成本几乎为零。用完觉得香,欢迎一起把它养得更肥:
- 发现常用镜像不在支持列表?去仓库的 Issue 区提需求,白名单靠社区共建。
- 想动手改代码?仓库里的
hack/目录就是维护白名单的工具集,verify-allows.sh、fmt-image-match.sh、verify-image-match.sh这些脚本改完记得跑一遍校验。
需要拉源码的话:
git clone https://gitcode.com/GitHub_Trending/pu/public-image-mirror少踩一个坑,就多省一小时。去试试吧。
【免费下载链接】public-image-mirror很多镜像都在国外。比如 gcr 。国内下载很慢,需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。项目地址: https://gitcode.com/GitHub_Trending/pu/public-image-mirror
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考