自建Docker镜像加速器

自建Docker镜像加速器

阅读量:
评论数:

自建Docker镜像加速服务

更新

2023/7/8

更新vps删除镜像缓存方法

2023/7/30

优化docker-composse.yml

前言

自上一章给docker换镜像加速器及使用docker proxy之后,我就想着能不能自己用海外能够正常访问各官方镜像源的小鸡给国内小鸡做代理镜像加速器,Google了半天,发现docker是可以用Registry这个容器来实现代理。接下来将用该容器代理registry-1.docker.io及ghcr.io。

搭建Registry作为镜像加速器

Docker官方介绍:Registry as a pull through cache | Docker Documentation

工作原理

当您首次从本地注册表镜像请求图像时,它会从公共Docker注册表中拉取图像,并在将其返回给您之前将其存储在本地。在后续的请求中,本地注册表镜像可以从自己的存储中提供图像。

前期准备

1.一个没有被墙的、延迟和带宽较好的非大陆小鸡🐔(墙了的话可以试试套cf)

2.一个域名,解析到你的小鸡的ip上,申请好证书,后续反代需要,反代的话可以看看这篇:nginxWebUI使用方法 - MJ的博客

3.安装好了docker及docker-compose,没有的话可以看看这篇:Docker安装 - MJ的博客

开始开始🥰

创建账号密码

如果你想整个公益、公开的镜像源可以跳过,我试了下想放到镜像加速器里使用的话带密码就不行,死活不走我自建的镜像地址下载😇

假设你反代后的地址是:hub.xxx.com

如果加密码,你可以这样拉取镜像

docker login hub.xxx.com 
# 输入账号密码登录

docker pull hub.xxx.com/emby/embyserver 

# 即便加入镜像加速器使用 docker pull emby/embyserver 拉取也会走 docker.io 下载
# 可能是我的配置问题,或者有我目前不知道的方法可以做到密码认证的镜像加速器

如果不加密码,你可以这样拉取

# 已经将 https://hub.xxx.com 加入镜像加速器

docker pull emby/embyserver

因为是自用,所以先创建好账号密码。

# htpasswd文件上一层文件夹要先建好
# 替换username passwd为你的账号密码

docker run --rm --entrypoint \
    htpasswd httpd:2 -Bbn \
    username passwd > /root/registry/htpasswd

#记好自己的密码

编辑docker-compose.yml文件

来源于:yangchuansheng/registry-proxy: Docker 镜像仓库代理 (github.com)

我稍稍修改了下,因为使用的镜像是很久之前的版本了,所以提取了config.yml放在最新的registry容器内,然后使用我之前建好的nginx反代。

使用密码的话请把注释取消。

version: '2'
services:
  docker-hub:
    container_name: reg-docker-hub
    image: registry:latest
    restart: always
    environment:
      - REGISTRY_STORAGE_DELETE_ENABLED=true
      #- REGISTRY_AUTH=htpasswd
      #- REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
      #- REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm   
    volumes:
      - ./docker-hub.yml:/etc/docker/registry/config.yml
      - ~/data/registry:/var/lib/registry
      #- ./htpasswd:/auth/htpasswd
    ports:
      - 51000:5000
    networks:
      - registry-net

  ghcr:
    container_name: reg-ghcr
    image: registry:latest
    restart: always
    #environment:
      #- REGISTRY_AUTH=htpasswd
      #- REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
      #- REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm  
    volumes:
      - ./ghcr.yml:/etc/docker/registry/config.yml
      - ~/data/registry:/var/lib/registry
      #- ./htpasswd:/auth/htpasswd
    ports:
      - 52000:5000
    networks:
      - registry-net

  ui:
    container_name: reg-ui
    image: joxit/docker-registry-ui:latest
    restart: always
    links:
      - docker-hub:reg-docker-hub
    ports:
      - 50000:80
    environment:
      - REGISTRY_TITLE=My Private Docker Registry
      - NGINX_PROXY_PASS_URL=http://reg-docker-hub:5000
      - DELETE_IMAGES=true
      - SHOW_CONTENT_DIGEST=true
      - SINGLE_REGISTRY=true
    networks:
      - registry-net

networks:
  registry-net:

一点解释

reg-ui只是提供一个web界面查看已有镜像,如果不需要的话可以不要这个容器

镜像缓存地址在这里,请自行选择位置。

    volumes:
      - ~/data:/var/lib/registry

这里是config.yml文件,为了在宿主机内区分开来我修改了下名字。

    volumes:
      - ./docker-hub.yml:/etc/docker/registry/config.yml

编辑config.yml文件

官方给的完整配置:Configuring a registry | Docker Documentation

太长不看,直接白嫖老哥的配置。

每个容器一个config.yml,以docker.io为例

version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    Access-Control-Expose-Headers: ['Docker-Content-Digest']
    Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE']
    Access-Control-Allow-Origin: ['*']
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3
proxy:
  remoteurl: https://registry-1.docker.io
  username: 
  password:
# 最关键的是这一块,remoteurl填写要代理的地址,如果想要登录自己的账号也可以填写账号密码
# 要是想代理ghcr.io只需要将remoteurl改为https://ghcr.io
proxy:
  remoteurl: https://registry-1.docker.io
  username: username
  password: password

代理点别的

如果你还有别的镜像加速需求,比如k8s.gcr.io、gcr.io、quay.io,可以在docker-compose.yaml里添加一个registry容器,新建修改下config.yml文件的remoteurl地址即可。

启动

使用docker-compose命令一键启动

docker-compose up -d

反向代理

反代可以看看这篇:nginxWebUI使用方法 - MJ的博客

将暴露出来的端口反代即可

清理镜像缓存

reg-ui容器提供一个web管理页面,但不能删除缓存的镜像

所以我直接定时把宿主机存放镜像缓存的文件夹清空再重启registry容器。

我的镜像缓存在/root/data文件夹内,docker-compose.yml文件在/root/registry中,

我打算每3天的凌晨2点清空缓存,我的crontab配置如下:

0 2 */3 * * rm -r /root/data/* && cd /root/registry && docker-compose restart

你可以根据自己的配置进行修改。

客户端使用

拉取docker hub的镜像

2种方法:

在镜像名前添加自己的域名

# 如果有密码
docker login hub.xxx.com 
# 输入账号密码登录

docker pull hub.xxx.com/emby/embyserver 

将域名添加至/etc/docker/daemon.json配置镜像加速器,见:Docker Hub被墙如何解决 - MJ的博客

# 不要配置密码

docker pull emby/embyserver 

拉取非docker hub的镜像

docker应该不支持配置 非docker.io 的 registry mirror吧😅

存在哪的你要先在服务端建好对应代理容器。

# 随便找的一个存放在ghcr.io的镜像
docker pull ghcr.xxx.com/enchant97/note-mark-frontend:0.6.0-alpha

看看正在用哪个镜像加速服务下载镜像

ssh开两个会话窗口

一个窗口随便拉个大点的镜像,另一个窗口使用ss -ntp | grep dockerd命令查看当前连接的IP是啥,再用IP反查域名,就可以知道当前使用的是哪个镜像加速器了

参考文档

1.yangchuansheng/registry-proxy: Docker 镜像仓库代理 (github.com)

2.Docker 镜像加速教程 – 云原生实验室 - Kubernetes|Docker|Istio|Envoy|Hugo|Golang|云原生 (icloudnative.io)

3.Docker Compose 部署配置和使用 Registry 私有镜像仓库 - 思有云 - IOIOX

4.谷歌到的各种文章及docker官方文档

Built with Halo
主题 Stack Jimmy 设计 • 由Jiewen移植
📑共水了 93篇文章.
载入天数... 载入时分秒...
RSS Icon RSS订阅