自建 Docker Hub 镜像服务

查看 373|回复 30
作者:marquina   
原文连接:自建 Docker Hub 镜像服务 - OrangeWolf 的博客
1. 前言

最近在某些神秘力量的影响下,SJTUG/USTC 等知名 Docker Hub 镜像站陆续停止服务。
文本使用CNCF Distribution的 registry 项目,只需要运行一个 Docker 容器,就可以自建 Docker Hub 镜像服务。
2. 所需条件
  • 可运行 Docker 容器的服务器
  • 可以访问 docker.io 的 HTTP 代理(如果服务器无法直接访问的话)

    3. 编写 registry 配置文件
    下面是笔者的 registry 配置文件,设置 Docker Hub 镜像的核心配置是proxy:
    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
      ttl: 168h
    4. 生成 SSL 证书
    registry 默认使用 HTTP 协议对外提供服务,使用 HTTPS 更安全&更通用。笔者生成自签名证书的命令如下:
    openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 \
      -nodes -keyout example.com.key -out example.com.crt -subj "/CN=example.com" \
      -addext "subjectAltName=DNS:example.com,DNS:*.example.com,IP:100.x.x.x,IP:192.168.1.30"
    5. 启动 registry 服务
    准备好 registry 的存储目录,放入上一步生成的证书文件。然后编写如下 docker-compose 文件:
    version: '3.1'
    services:
      registry:
        image: registry:2
        network_mode: "host"
        environment:
          REGISTRY_HTTP_ADDR: "0.0.0.0:5000"
          REGISTRY_HTTP_TLS_KEY: "/var/lib/registry/example.com.key"
          REGISTRY_HTTP_TLS_CERTIFICATE: "/var/lib/registry/example.com.crt"
          HTTPS_PROXY: "{HTTP 代理地址}"
        restart: always
        container_name: registry
        volumes:
          - "/{你的路径}/registry:/var/lib/registry"
          - "/{你的路径}/registry_config.yml:/etc/docker/registry/config.yml"
    用 docker-compose 运行容器即可启动服务:
    docker-compose -f registry.yml up -d
    此时 registry 会在笔者的服务器上,也就是https://192.168.1.30:5000提供服务。
    6. 客户端使用
    6.1 信任 SSL 证书
    由于 registry 使用的是自签名 SSL 证书,客户端要想成功拉取镜像需要先信任该证书。方式有两种,第一种是将证书加入客户端的的系统信任列表(推荐):
    sudo cp /${你的路径}/example.com.crt /usr/share/ca-certificates
    sudo dpkg-reconfigure ca-certificates
    然后重启 Docker/K3S 等需要拉取镜像的服务;第二种是让 Docker 拉取镜像时跳过证书校验:
    sudo vim /etc/docker/daemon.json
    {
      ...
      "insecure-registries": ["192.168.1.30:5000"]
      ...
    }
    然后重启 docker 服务。
    信任完证书后,此时就可以拉取 Docker Hub 上的镜像看到效果了:
    docker pull 192.168.1.30:5000/grafana/grafana:main
    6.2 设置 Docker 镜像源
    同样是编辑/etc/docker/daemon.json,将上述 registry 服务作为 Docker 镜像源:
    {
      ...
      "registry-mirrors": [
        "https://192.168.1.30:5000"
      ]
      ...
    }
    然后重启 Docker 服务,此时就可以快速拉取镜像了
    docker pull grafana/grafana:main
    enjoy!
  • marquina
    OP
      
    只收藏不评论是吧,挽尊一下
    gunner168   
    这么好的东西必须点赞
    Ethan9527   
    可以用我们的 https://image.jianmuhub.com/
    wu67   
    道理我都懂, 可是为什么不直接挂上代理呢, 整那么复杂做什么?
    marquina
    OP
      
    @wu67 @wu67 #4 你说的代理可能是透明代理?
    我的场景不是整个网络透明代理,甚至还包括公网机器,所以并不是简单挂个代理就能解决哈
    Pig930   
    想问一下有类似的自建 npm 、GitHubCDN 、PyPi 镜像的方法吗
    marquina
    OP
      
    @Pig930 应该是有的,不过没了解过
    yinmin   
    内网有多台 docker ,最简单的方式是做一个 SNI Proxy ,然后内网 DNS Server 将域名 production.cloudflare.docker.com 指向 SNI Proxy IP 。如果没有部署内网 DNS Server ,可以修改 Docker 主机的/etc/hosts 将 production.cloudflare.docker.com 指向 SNI Proxy IP 。
    SNI Proxy 可以使用 sniproxy 软件,debian 、ubuntu 使用 apt install sniproxy 安装; alpine 使用 apk add sniproxy 安装。
    mohumohu   
    @marquina https://docs.docker.com/network/proxy/
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部