自建Docker镜像加速教程

本文最后更新于 316 天前, 如有失效请评论区留言.

在日常生活工作中, 需要经常访问 hub.docker.com 等诸多镜像仓库,由于技术原因,这些镜像仓库在国内访问体验很差。针对这种情况,国内不少云厂商推出类似服务,采用定时同步的方式来缓存,镜像更新有些滞后性,这里尤其说下阿里云镜像仓库,体验特别差。

基于上述诸多原因,为了能够顺利使用dockerhub等镜像仓库,我们需要在大洋彼岸部署一个镜像缓存仓库服务。利用 Docker 的开源项目 registry 就可以实现这个需求,registry 不仅可以作为本地私有镜像仓库,还可以作为上游镜像仓库的缓存,也就是 pull through cache

前提条件

  • 境外独立IP服务器
    • 硬盘比较大
    • 网络质量好
  • 域名

原理

就是利用registry缓存机制,通过配置remoteurl参数开启缓存上游镜像仓库

部署

这里默认以dockerhub为例其他类似

k8s部署

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: dockerhub
  name: dockerhub
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dockerhub
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: dockerhub
    spec:
      containers:
      - image: ysicing/registry
        imagePullPolicy: Always
        name: dockerhub
        ports:
        - containerPort: 5000
          protocol: TCP
        volumeMounts:
        - mountPath: /etc/localtime
          name: localtime
        - mountPath: /var/lib/registry
          name: registry
      dnsConfig:
        nameservers:
        - 8.8.8.8
        - 8.8.4.4
      dnsPolicy: None
 #    nodeSelector:
 #      node-role.kubernetes.io/us: "true"
      restartPolicy: Always
 #    tolerations:
 #    - key: nogfw
 #      operator: Exists
      volumes:
      - hostPath:
          path: /etc/localtime
          type: ""
        name: localtime
      - hostPath:
          path: /var/lib/registry
          type: ""
        name: registry
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: dockerhub
  name: dockerhub
spec:
  ports:
  - name: http
    port: 5000
    protocol: TCP
    targetPort: 5000
  selector:
    app: dockerhub
  type: ClusterIP

将上面的yaml保存为dockerhub.yaml

kubectl apply -f dockerhub.yaml

docker部署

version: '3.9'
services:
  dockerhub:
    image: ysicing/registry
    container_name: dockerhub
    restart: always
    ports:
      - "5000:5000"
    dns: 8.8.8.8
    volumes:
      - '/data/registry/dockerhub:/var/lib/registry'

将上面的文件保存为docker-compose.yaml

docker compose up -d

配置caddy

# /etc/caddy/h.caddy
h.ysicing.net {
tls root@ysicing.net
reverse_proxy http://10.143.140.182:5000
}

其中10.143.140.182为我的k8s service ip可以根据自己的情况改成相对应的ip

验证

docker pull h.ysicing.net/ysicing/debian

缓存其他镜像仓库

原理类似,如需要缓存gcr.io 配置相关环境变量即可 PROXY_REMOTE_URL

- env:
  - name: PROXY_REMOTE_URL
    value: gcr.io
  image: ysicing/registry

运行时配置

这里以docker和containerd配置示例

Docker

Docker 可以修改配置文件 /etc/docker/daemon.json,添加下面的内容:

{
  "registry-mirrors": [  "https://h.ysicing.net"],
  "data-root": "/data/docker",
  "bip": "169.254.123.1/24",
  "max-concurrent-downloads": 10,
  "live-restore": true,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "30m",
    "max-file": "3"
  },
  "storage-driver": "overlay2"
}

重启docker后,可以直接拉取镜像,可以不指定代理服务器

docker pull ysicing/debian
docker pull h.ysicing.net/ysicing/debian

Containerd

这里以k3s的containerd为例哈, 配置文件为/etc/rancher/k3s/registries.yaml

mirrors:
  docker.io:
    endpoint:
      - "https://h.ysicing.net"

缓存清理

比较暴力,定时删除持久化目录并重启

SLA

目前免费提供一个https://h.ysicing.net, 但是不保证长期使用,如果想长期使用可以考虑赞助我一下哈哈哈(看使用量,目前大概有7、8个人在用非常稳定😄)

其他说明

  • 镜像由上游维护,不保证其安全性
  • 使用本服务时已经具备完全民事行为能力。如您不是完全民事行为能力人,请在法定监护人监督下,访问、使用本服务。否则由此导致的一切后果,由您及您的监护人承担`
  • 如果发现有问题,请留言反馈

参考文档

Registry as a pull through cache

Sponsor

Like this article? $1 reward

Comments

Teacher Du ·v1 香港 Reply

你这直接用K8S部署,量级有些大啊!

ysicing 👨‍💻 ·v1 Reply

@Teacher Du 方便管理呀,k3s跨地域组网的,编排服务很方便