DockerHub 国内镜像解决方案

DockerHub 国内镜像解决方案

hb0730 146 2024-07-08

下面的说法来源于网络
2024.06.06,上海交大的Docker Hub镜像加速器宣布因为监管要求被下架。
index服务器被DNS污染,导致无法拉取镜像。
做好全面脱钩的准备
自主知识产权的国产Docker将会横空出世
临时性管控(过段时间就恢复)

DockerHub 国内镜像解决方案

目前 DockerHub 仓库镜像服务基本都下线了, Docker 可以说是开发人员的必备工具,这个影响还是很大的。对老胡来说,不论是从个人还是技术团队,如何配置 DockerHub 镜像加速是个急需解决的问题。

  1. 第三方镜像加速
  2. 自建
    2.1 基于 Cloudflare Workers 镜像代理
    2.2 基于 Github Action 转存同步
    2.3 购买服务器-自搭建

第三方镜像加速

加速地址说明
https://docker.m.daocloud.ioDaoCloud 驱动,可以去github 提需要的镜像同步
https://dockerpull.comDocker Proxy 驱动
https://atomhub.openatom.cnAtomHub 提供,仅有基础镜像
https://docker.1panel.live1panel 驱动
https://dockerhub.jobcher.com打工人日报驱动
https://hub.rat.dev耗子面板驱动
https://docker.registry.cyoubestcfipas 驱动
https://docker.awsl9527.cnzeruns 驱动

自建

通过vps

购买海外vps(最后对大陆路线进行优化的,可以直链访问),通过 distribution 搭建 docker-registry

version: "3"
services:
  registry:
    image: registry:2
    container_name: registry
    restart: unless-stopped
    environment:
      TZ: Asia/Shanghai
    ports:
      - 5000:5000
    volumes:
      - ./conf/config.yml:/etc/docker/registry/config.yml:ro
      - ./data/registry:/var/lib/registry
    networks:
      nginx-net:
        ipv4_address: 192.168.208.4
networks:
  nginx-net:
    external: true
  • config.yml
version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3
proxy:
  remoteurl: https://registry-1.docker.io
  • nginx config
upstream docker-registry {
  server 192.168.208.4:5000;
}

map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
  '' 'registry/2.0';
}

server {
  listen 80;
  listen [::]:80;
  listen 443 ssl;
  listen [::]:443 ssl;
  server_name xxxx;

  access_log /var/log/nginx/fluentbit_docker_proxy_access.log;
  #listen 127.0.0.1:5000 ssl http2 proxy_protocol;
  # SSL
  ssl_certificate  /etc/nginx/cert/xxxx.pem;
  ssl_certificate_key /etc/nginx/cert/xxxx.key;

  ssl_protocols TLSv1.1 TLSv1.2;
  ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;

  client_max_body_size 0;

  chunked_transfer_encoding on;

  location /v2/ {
    if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {
      return 404;
    }

    add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;

    proxy_pass                          http://docker-registry;
    proxy_set_header  Host              $http_host;
    proxy_set_header  X-Real-IP         $remote_addr;
    proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto $scheme;
    proxy_read_timeout                  900;

  }
}

这样你就可以通过 docker的 registry-mirrors镜像 加速访问构建

基于平台

基于 CF 搭建的话推荐:CF-Workers-docker.io,部署方式支持 WorkersPages,教程在 README 中,讲得也很清楚。

使用 Github Action 推荐 tech-shrimp/docker_image_pusher

  • 支持DockerHub, gcr.io, k8s.io, ghcr.io等任意仓库
  • 支持最大40GB的大型镜像
  • 使用阿里云的官方线路,速度快

使用

不论是用第三方还是自建,使用基本都是类似的:

# 通过域名使用
# 说明:library是一个特殊的命名空间,它代表的是官方镜像。如果是某个用户的镜像就把library替换为镜像的用户名
docker pull {domain}/library/alpine:latest

# 设置 registry mirror,推荐
tee /etc/docker/daemon.json <<EOF
{
    "registry-mirrors": ["https://xxx.xxx"]
}
EOF
# 在里面填上代理域名即可,可以多个
systemctl daemon-reload
systemctl restart docker

其他

如果通过github action setup-buildx-action 去构建docker 镜像时发现无法 connect: connection refused 说明没有走 docker宿主配置的docker-mirror可以采取以下方式

name: Set Up Docker Buildx
uses: https://gitee.com/actions-mirror/docker-setup-buildx-action@v3
with:
  config-inline: |
    [registry."docker.io"]
      mirrors = ["xxx.xxx"]