自建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官方文档