把 docker pull 的等待时间压下来:用 public-image-mirror 给镜像拉取换一条快车道

把 docker pull 的等待时间压下来:用 public-image-mirror 给镜像拉取换一条快车道

【免费下载链接】public-image-mirror 很多镜像都在国外。比如 gcr 。国内下载很慢,需要加速。致力于提供连接全世界的稳定可靠安全的容器镜像服务。 【免费下载链接】public-image-mirror 项目地址: https://gitcode.com/GitHub_Trending/pu/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.iodocker.m.daocloud.io
gcr.iogcr.m.daocloud.io
ghcr.ioghcr.m.daocloud.io
k8s.gcr.iok8s-gcr.m.daocloud.io
registry.k8s.iok8s.m.daocloud.io
mcr.microsoft.commcr.m.daocloud.io
quay.ioquay.m.daocloud.io
nvcr.ionvcr.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.iokind 的 --image 参数同理
内网离线缓存本地 registry:8888,proxy 指向 m.daocloud.io客户端需配 insecure-registries
缓存时效公共 30 天;本地 ttl 示例 2160h过期后下次拉取重新同步
git clone https://gitcode.com/GitHub_Trending/pu/public-image-mirror

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

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

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值