把 docker pull 的等待时间压下来:用 public-image-mirror 给镜像拉取换一条快车道
凌晨的 CI 机器上执行 docker pull 拉一个 gcr.io 镜像,进度条停在 Downloading 二十分钟没动,整条流水线跟着挂起。public-image-mirror 是一个容器镜像加速项目,把 gcr.io、ghcr.io、docker.io 等国外镜像仓库同步到国内的 m.daocloud.io 域名,解决国内拉取海外镜像仓库慢且不稳定、部分仓库直接不可达的问题。原镜像地址前面加一段前缀就能以国内速度拉取,所有 sha256 哈希与源仓库一致,不需要动任何代码。
先把镜像跑通
最短路径是"加前缀"方式:在原地址前直接加 m.daocloud.io/,不改动任何 daemon 配置。
# docker.io/library/busybox → m.daocloud.io/docker.io/library/busybox
docker pull m.daocloud.io/docker.io/library/busybox
# 拉下来直接起容器验证
docker run -d -P m.daocloud.io/docker.io/library/nginx
另一种是"前缀替换":把地址里的 docker.io 换成 docker.m.daocloud.io,即 docker.m.daocloud.io/library/busybox。拉单个镜像用加前缀即可,pull 成功就能直接用,后面都不用看。
按你的环境对号入座
Docker daemon 全局加速
想让这台机器上所有拉取都走镜像、不想逐条改命令的人,把加速域名写进 /etc/docker/daemon.json 的 registry-mirrors 字段:
{
"registry-mirrors": [
"https://docker.m.daocloud.io"
]
}
sudo systemctl restart docker
这个字段只能放 docker.io;gcr.io 等其他源站不能配置到这里,否则解析不到对应仓库。Podman 用户在 /etc/containers/registries.conf 里配置,它和 Docker 不同,gcr.io、quay.io、registry.k8s.io 也可以各自加 mirror。
kubeadm / kind 集群镜像加速
准备装集群、搭 kind 本地环境的人,把集群的 imageRepository 换成加速域名,kubeadm 配置只需要两行:
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
dns:
imageRepository: k8s.m.daocloud.io/coredns
imageRepository: k8s.m.daocloud.io
本地 kind 集群:
kind create cluster --name kind --image m.daocloud.io/docker.io/kindest/node:v1.22.1
不想改任何 yaml 的话,有 Webhook 组件可以在不修改 yaml 的前提下自动把新建 Pod 的镜像地址改走镜像,部署方式见 README.md 的"加速所有 Pod"一节。
内网离线缓存
集群完全不出公网的场景,起一个本地 registry 当缓存代理,代理层指向 m.daocloud.io:
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
volumes:
cache-data: {}
registry-config 内容,关键是 proxy 段:
version: 0.1
storage:
delete:
enabled: true
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :8888
proxy:
remoteurl: https://m.daocloud.io
ttl: 2160h
docker compose up -d 启动后,客户端把 <registry-ip>:8888 写进 insecure-registries,之后拉取加本地前缀即可,如 docker pull <registry-ip>:8888/docker.io/library/nginx:latest。完整配置见 docs/local-cache/README.md。
| 源站 | 加速域名 |
|---|---|
| docker.io | docker.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 | k8s.m.daocloud.io |
| mcr.microsoft.com | mcr.m.daocloud.io |
| quay.io | quay.m.daocloud.io |
| nvcr.io | nvcr.m.daocloud.io |
k8s.gcr.io 已迁移到 registry.k8s.io,新工程直接用后者。
几个容易忽略的细节
- 时间窗:建议把大拉取任务放在北京时间凌晨 01-07 点,其他时段队列非常拥挤。
- tag 策略:优先
@sha256:摘要,其次明确版本号 tag,最后才考虑 latest;latest 是可变 tag,源更新后会先响应旧数据,后台重新同步。 - 缓存时效:公共缓存只保留 30 天,过期后下次拉取需要重新同步;本地缓存的 ttl 自己定,示例值 2160h 即 90 天。
- 同步延迟:manifest 有 1 小时内存缓存,源端更新了 tag,一小时后才拉得到新内容。
- 状态查看:同步队列状态页只保留一小时的同步记录;白名单与限流的公开信息在仓库 issue #2328。
速查
| 操作场景 | 关键配置/命令 | 备注 |
|---|---|---|
| 拉单个镜像 | docker pull m.daocloud.io/docker.io/<镜像> | 加前缀方式,无需改配置 |
| Docker 全局加速 | daemon.json 的 registry-mirrors 写 https://docker.m.daocloud.io | 重启 docker 生效,仅 docker.io 可用 |
| K8s 集群安装 | kubeadm 的 imageRepository 设为 k8s.m.daocloud.io | kind 的 --image 参数同理 |
| 内网离线缓存 | 本地 registry:8888,proxy 指向 m.daocloud.io | 客户端需配 insecure-registries |
| 缓存时效 | 公共 30 天;本地 ttl 示例 2160h | 过期后下次拉取重新同步 |
git clone https://gitcode.com/GitHub_Trending/pu/public-image-mirror
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



