自建dockerhub registry 镜像站

356 阅读1分钟

0、前提

(1)拥有一台海外公有云服务器,根据自己能承受的成本,带宽尽可能大些,这样拉取镜像时能快些。

(2)web代理服务器为treafik,这个根据自己熟悉的来即可,如果用nginx,调整部署配置即可。

(3)准备一个域名以及SSL证书。docker镜像源默认https。下面配置的docker.xxx.work是我的域名。

说明:下面配置的路径,都是根据自己实际去配置和调整。

1、git仓库

github.com/DaoCloud/cr…

2、源码构建镜像

在服务器上构建即可。

docker build -t crproxy:v0.12.2 .

3、Traefik 配置

文件/opt/websrv/config/traefik/config/crproxy.yaml 。(我的treafik.yaml文件路径为/opt/websrv/config/traefik/traefik.yaml)

http:
  routers:
    # docker registry crproxy服务
    # https://github.com/DaoCloud/crproxy
    dockerhub-registry:
      entryPoints:
        - "https"
      service: "dockerhub-registry-service" # 对应 services 节点的服务
      rule: "Host(`docker.xxx.work`)"
      priority: 42
      tls:
         domains:
           - main: "docker.xxx.work"
             sans:
               - "docker.xxx.work"
      # middlewares:
      #  - "traefik-auth"

  services:
    dockerhub-registry-service:
      loadBalancer:
        servers:
          - url: "http://dockerhub-registry:8080"


tls:
    certificates:
      - certFile: /opt/websrv/config/certs/docker.xxx.work_bundle.pem
        keyFile: /opt/websrv/config/certs/docker.xxx.work.key
        stores:
          - default

4、docker-compose

default-registry,我配置为mirror.ccs.tencentyun.com,是因为我的服务器是国内腾讯云服务器,没有海外服务器,mirror.ccs.tencentyun.com是腾讯云的dokcer镜像源加速的内网地址。

services:
  dockerhub-registry:
    image: crproxy:v0.12.2
    container_name: dockerhub-registry
    restart: unless-stopped
    labels:
      - traefik.enable=true
      - traefik.docker.network=network-traefik
    #ports:
    #- 80:8080
    #- 443:8080
    command: |
      --acme-cache-dir=/tmp/acme
      --acme-hosts=*
      --default-registry=mirror.ccs.tencentyun.com
    tmpfs:
      - /tmp/acme
    networks:
      - traefik-webgateway

networks:
  traefik-webgateway:
    name: network-traefik
    external: true

然后docker compose up -d

5、使用

vim /etc/docker/daemon.json

{
        "registry-mirrors":[
                "https://docker.xxx.work"
        ]
}

然后

systemctl daemon-reload
systemctl restart docker

完成。