彻底解决 Gcr、Quay、DockerHub 镜像下载难题!

  发布时间:2026-11-16   作者:玩站小弟   我要评论
谷歌蜘蛛池租用【tg:seogoogle987】。

本文转载自微信公众号「云原生实验室」,作者米开朗基杨。转载本文请联系云原生实验室公众号。 

前言

在使用 Docker 和 Kubernetes 时,我们经常需要访问 gcr.io 和 quay.io 镜像仓库,由于众所周知的原因,这些镜像仓库在中国都无法访问,唯一能访问的是 Docker Hub,但速度也是奇慢无比。gcr.azk8s.cn 是 gcr.io 镜像仓库的代理站点,原来可以通过 gcr.azk8s.cn 访问 gcr.io 仓库里的镜像,但是目前 *.azk8s.cn 已经仅限于 Azure 中国的 IP 使用,不再对外提供服务了。国内其他的镜像加速方案大多都是采用定时同步的方式来缓存,这种方法是有一定延迟的,不能保证及时更新,ustc 和七牛云等镜像加速器我都试过了,非常不靠谱,很多镜像都没有。

为了能够顺利访问 gcr.io 等镜像仓库,我们需要在墙外自己搭建一个类似于 gcr.azk8s.cn 的镜像仓库代理站点。利用 Docker 的开源项目 registry[1] 就可以实现这个需求,registry 不仅可以作为本地私有镜像仓库,还可以作为上游镜像仓库的缓存,也就是 pull through cache。

先来感受下速度:

1. 前提条件

一台能够施展魔法的服务器(你懂得,可以直接访问 gcr.io)

一个域名和域名相关的 SSL 证书(doc彻底ker pull 镜像时需要验证域名证书),一般用 Let's Encrypt[2] 就够了。

2. 核心思路

registry 可以通过设置参数 remoteurl 将其作为远端仓库的缓存仓库,这样当你通过这个私有仓库的地址拉取镜像时,regiistry 会先将镜像缓存到本地存储,然后再提供给拉取的客户端(有可能这两个步骤是同时的,我也不太清楚)。我们可以先部署一个私有 registry,然后将 remoteurl 设为需要加速的镜像仓库地址,基本上就可以了。

3. 定制 registry

为了能够支持缓存 docker.io、gcr.io、k8s.gcr.io、quay.io 和 ghcr.io 等常见的公共镜像仓库,我们需要对 registry 的配置文件进行定制,Dockerfile 如下:

FROM registry:2.6 LABEL maintainer="registry-proxy Docker Maintainers https://fuckcloudnative.io" ENV PROXY_REMOTE_URL=""      DELETE_ENABLED="" COPY&nb解决sp;entrypoint.sh /entrypoint.sh 

其中 entrypoint.sh 用来将环境变量传入配置文件:

entrypoint.sh

#!/bin/sh  set -e  CONFIG_YML=/etc/docker/registry/config.yml  if [ -n "$PROXY_REMOTE_URL" -a `grep -c "$PROXY_REMOTE_URL" $CONFIG_YML` -eq 0 ]; then     echo "proxy:" >> $CONFIG_YML     echo "  remoteurl: $PROXY_REMOTE_URL" >> $CONFIG_YML     ec Gho "  username: $PROXY_USERNAME" >> $CONFIG_YML     echo "  password: $PROXY_PASSWORD" >> $CONFIG_YML     echo "------ Enabled proxy to remote: $PROXY_REMOTE_URL ------" elif [ $DELETE_ENABLED = true -a `grep -c "delete:" $CONFIG_YML` -eq 0 ]; then     sed -i '/rootdirectory/a  deletcre:' $CONFIG_YML     sed -i '/delete/a    enabled: true' $CONFIG_YML     echo "------ Enabled local storage delete -----" fi  sed -i "/headers/a    Access-Control-Allow-Origin: ['*']" $CONFIG_YML sed -i "/headers/a    Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE']" $CONFIG_YML sed -i、Q "/headers/a    Access-Control-Expose-Headers: ['Docker-Content-Digest']" $CONFIG_YML  case "$1" in     *.yaml|*.yml) set -- registry serve "$@" ;;     serve|garbage-collect|help|-*) set -- registry "$@" ;; esac  exec "$@" 

4. 启动缓存服务

构建好 Docker 镜像之后,就可以启动服务了。如果你不想自己构建,可以直接用我的镜像:yangchuansheng/registry-proxy。

一般来说,即使你要同时缓存 docker.io、gcr.io、k8s.gcr.io、quay.io 和 ghcr.io,一台 1C 2G 的云ua主机也足够了(前提是你不在上面跑其他的服务)。我的博客、评论服务和其他一堆乱七八糟的服务都要跑在云主机上,所以一台是不满足我的需求的,我直接买了两台腾讯云香港轻量级服务器。

既然买了两台,肯定得组个 k3s 集群啦,看主机名就知道我是用来干啥的。其中 2C 4G 作为 master 节点,1C 2G 作为 node 节点。

以 docker.io 为例,创建资源清单:

dockerhub.yaml

apiVersion: apps/v1 kind: Deployment metadata:   name: dockerhub   labels:     app: dockerhub spec:   replicas: 1   selector:     matchLabels:       app: dockerhub   temy、plate:     metadata:       labels:         app: dockerhub     spec:       affinity:         podAntiAffinity:           preferredDuringSchedulingIgnoredDuringExecution:           - podAffinityTerm:     &Donbsp;         labelSelector:                 matchExpressions:                 - key: app                   operator: In                   ck;values:                   - dockerhub               topologyKey: kubernetes.io/hostname             weight: 1       dnsPolicy: None       dnsConfig:         nameservers:   er        - 8.8.8.8           - 8.8.4.4       containers:       - name: dockerhub         image: yangchuansheng/registry-proxy:latest         env:         - name: PROXY_REMOTE_URL       &nHubsp;   value: https://registry-1.docker.io         - name: PROXY_USERNAME           value: yangchuansheng         - name: PROXY_PASSWORD           value:  **         ports:         - containerPort: 5000 b ;          protocol: TCP         volumeMounts:         - mountPath: /etc/localtime           name: localtime         - mountPath: /var/lib/registry           name: registry       volumes: 镜像;      - name: localtime         hostPath:           path: /etc/localtime       - name: registry         hostPath:           path: /var/lib/registry --- apiVersion: v1 kind: Service metadata:   name: dockerhub&n下载bsp;  labels:     app: dockerhub spec:   selector:     app: dockerhub   ports:     - protocol: TCP       name: http       port: 5000       targetPort: 5000 

使用资源清单创建对应的服务:

  • Tag:

相关文章

  • 标签: 启元Q1 上纬启元 稚晖君 个人机器人

    云梦级1月7日云梦级消息,伴随着NIVIDA物理AI全家桶的发布,CEO黄仁勋面向全球高调宣布:“AI已经长出了手脚,走进了现实世界”,CES 2026成为正式点亮AI原生硬件新纪元的重要里程碑——一
    2026-11-16
  • #亚马逊考虑接受狗狗币支付#上热搜 网友:有没有猫猫币

    新浪科技讯 4月22日下午消息,#亚马逊考虑接受狗狗币支付#话题登上微博热搜,引发网友的广泛关注。 据外媒报道,亚马逊正考虑接受狗狗币作为支付方式。在上周狗狗币价格飙升后,近日已有超过14万人签署了一
    2026-11-16
  • 标签: 中国移动

    5月8日,在2026移动云大会主论坛上,中国移动发布移动模型服务平台MoMA。平台接入超300款业界主流AI模型,模型丰富度行业领先,首创Token集约化运营模式,推动AI像水和电一样“随时可得、随处
    2026-11-16
  • 标签: 豆包 千问 微信 PlayStation

    Hello,大家早上好,又是元气满满的一天,先来浏览新鲜的早报吧~ 【豆包、千问宣布下线智能体】 千问平台发布公告称,因功能升级与维护,拟人化互动类智能体及用户自建智能体功能将于 2026 年 7 月
    2026-11-16
  • CoreWeave与OpenAI续签巨额合同 合同金额已达224亿美元

    在 AI 行业日益火热的背景下,CoreWeave 与 OpenAI 于近日宣布进一步扩大合作。此次最新的租赁协议是两者年内的第三次合作,合同金额最高可达65亿美元,使得双方累计合同总额飙升至224亿
    2026-11-16
  • 标签: 小红书 云帆 Live Village

    云梦级12月18日云梦级消息,据凤凰网科技报道,小红书在几个月前对社区组织架构进行了深度调整,意在进行“产运研一体化融合”,该知情人士告诉凤凰网科技,新划分的职责中,由云帆(薯名)和新岛(薯名)各自负
    2026-11-16

最新评论