镜像加速实战:public-image-mirror 从单条命令到集群配置
【免费下载链接】public-image-mirror很多镜像都在国外。比如 gcr 。国内下载很慢,需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。项目地址: https://gitcode.com/GitHub_Trending/pu/public-image-mirror
docker pull gcr.io/...在国内网络下经常卡在 "Pulling from..." 不动,这就是 public-image-mirror 要解决的问题。它是 DaoCloud 开源的公共镜像加速服务,不改镜像内容,只改拉取路径。如果你需要在国内网络环境里稳定拉取海外公共镜像,这篇按"先跑通、再理解"的顺序讲。
先跑通:一条命令体验镜像加速
最快的体验方式是给原地址加一个加速前缀,然后直接拉:
docker pull m.daocloud.io/docker.io/library/nginx:latestm.daocloud.io是加速入口,后面的docker.io/library/nginx:latest是原镜像地址原样保留。服务对外的 sha256 与源仓库一致,镜像内容不变,变的只是拉取走的是缓存节点。
docker run -d -P m.daocloud.io/docker.io/library/nginx官方 README 给出的就是这个快速开始命令,可以直接替换成你自己的镜像。
什么场景用哪个域名:前缀添加与前缀替换
服务支持两种写法。
前缀添加(推荐):任何镜像都适用。规则是取完整原始地址(含源站域名),在开头加m.daocloud.io/:
gcr.io/google-containers/pause:3.6 ↓ m.daocloud.io/gcr.io/google-containers/pause:3.6前缀替换:仅对人工配置过加速域名的源站生效,把源站域名替换成下表中的加速域名即可,其余部分不变。例如docker.io/library/busybox替换为docker.m.daocloud.io/library/busybox。
| 源站 | 加速域名 | 说明 |
|---|---|---|
| docker.io | docker.m.daocloud.io | Docker Hub |
| gcr.io | gcr.m.daocloud.io | Google Container Registry |
| ghcr.io | ghcr.m.daocloud.io | GitHub Container Registry |
| registry.k8s.io | k8s.m.daocloud.io | Kubernetes 官方镜像 |
| k8s.gcr.io | k8s-gcr.m.daocloud.io | 该源站已迁移至 registry.k8s.io |
| mcr.microsoft.com | mcr.m.daocloud.io | 微软容器镜像源 |
| nvcr.io | nvcr.m.daocloud.io | NVIDIA NGC |
| quay.io | quay.m.daocloud.io | Quay 镜像源 |
| docker.elastic.co | elastic.m.daocloud.io | Elastic 镜像源 |
| dhi.io | dhi.m.daocloud.io | dhi 源 |
| registry.ollama.ai | ollama.m.daocloud.io | 实验内测中 |
注意:给 Docker 守护进程配置 registry-mirrors 时只应填docker.m.daocloud.io,不要把 docker.io 之外的源站加速域名配进去,每个源站的内容是不同的。
它是怎么工作的:懒加载缓存与白名单
服务本质是源 Registry 的镜像,采用懒加载:拉取命中缓存就直接交付;未命中时把任务放入同步队列,由后台从源站拉取并写入缓存,整个过程对拉取方透明。所有同步都受白名单约束:仓库根目录的 allows.txt 用通配规则描述可同步范围,单个镜像、某个仓库下的全部镜像、整站通配(/后跟**)三种粒度都有,文件里约一千三百条规则,新增镜像不需要改代码。
几个影响使用的参数:缓存内容保留 30 天,过期后需要重新同步;Manifest 有 1 小时内存缓存,源站的 tag 更新最迟约 1 小时才会同步;同步队列状态页只保留 1 小时记录。所以首次拉取某个新镜像可能要等几分钟,排队状态页只认最近一小时。
从单机到集群:守护进程与 K8s 的加速配置
一行配置让 Docker 全局走镜像加速
Docker 的 registry-mirrors 只对 docker.io 生效,其他仓库仍要靠前缀。编辑/etc/docker/daemon.json:
{ "registry-mirrors": [ "https://docker.m.daocloud.io" ] }保存后执行systemctl restart docker,此后拉取 Docker Hub 镜像自动走加速链路。
Podman 的规则写在/etc/containers/registries.conf(rootless 模式也可放用户目录),每个源站单独指定 mirror:
[[registry]] location = "docker.io" [[registry.mirror]] location = "docker.m.daocloud.io"gcr.io、ghcr.io、quay.io、registry.k8s.io 都可用同样写法配上对应加速域名。
K8s 集群镜像拉取加速配置
kubeadm 集群在 ClusterConfiguration 里改两处,coredns 等系统组件随之一并走加速源:
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.1已有集群想给所有 Pod 统一改写镜像,可以部署 repimage,只用 Webhook 自动替换新建 Pod 的 image 字段,不需要逐个改 yaml 和 Chart。
自查与排障:现象、排查命令、处理办法
| 现象 | 排查 | 处理 |
|---|---|---|
| 拉取被拒绝或持续 404 | grep -F "<仓库或镜像路径>" allows.txt,确认是否命中白名单规则 | 不在名单内:通过 Issue 申请添加;命中/*规则时确认没有多加一级目录 |
| tag 更新后拉到旧内容 | 检查是否使用了 latest 这类可变 tag | 优先用@sha256:摘要寻址,其次固定版本号;可变 tag 更新后需后台重新同步 |
| 之前能拉、现在重新变慢 | 缓存已过期(内容保留 30 天)或队列拥挤 | 重新拉取触发同步;把拉取任务放到凌晨闲时(北京时间 01-07 点) |
| 排队状态查不到 | 同步队列状态页仅保留最近 1 小时记录 | 在拉取后一小时内查看,或稍后重试拉取 |
完全离线或内网场景,可以按 docs/local-cache/README.md 自建 registry 做本地缓存代理:容器里跑 registry,proxy 指向https://m.daocloud.io,之后拉取只需把前缀换成内网地址。
小结
public-image-mirror 用名称映射加懒同步,把海外公共镜像的拉取路径改道到国内缓存节点,镜像内容与哈希保持不变。三个可以继续做的方向:按 local-cache 文档搭内网缓存降低外网依赖;接入 repimage 这类 webhook 让存量集群不改 yaml 就全局加速;把同步队列状态和服务状态页纳入例行巡检。
【免费下载链接】public-image-mirror很多镜像都在国外。比如 gcr 。国内下载很慢,需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。项目地址: https://gitcode.com/GitHub_Trending/pu/public-image-mirror
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考