自建Docker镜像加速服务:加速与优化镜像管理 | 浅时光博客

这个笔记剪藏自 https://www.dqzboy.com/8709.html

浅时光博客 · 10月18日 · 2021年 Docker 本文6252字,阅读约16分钟6.6w 次已读

一、场景描述

在部署Kubernetes集群时,面临的一个主要问题是镜像下载。许多镜像存储在k8s.gcr.io仓库中,然而由于国内的网络防火墙(GFW)的影响,无法直接访问该网站。尽管一些镜像可以通过阿里云的 k8s.gcr.io 同步解决国内无法下载GCR镜像的问题,但是仍有一些镜像无法在阿里云镜像仓库中找到。在这种情况下,我们需要采取一些措施来自行解决这个问题。

20240607 目前,国内已要求所有提供镜像站和镜像加速服务的机构停止其服务。

  • ✨️ 一键部署Docker镜像代理服务的功能,支持基于官方Docker Registry的镜像代理.
  • ✨️ 支持多个镜像仓库的代理,包括Docker Hub、GitHub Container Registry (ghcr.io)、Quay Container Registry (quay.io)和 Kubernetes Container Registry (k8s.gcr.io)
  • ✨️ 自动检查并安装所需的依赖软件,如Docker、Nginx等,并确保系统环境满足运行要求.
  • ✨️ 自动清理注册表上传目录中的那些不再被任何镜像或清单引用的文件
  • ✨️ 提供了重启服务、更新服务、更新配置和卸载服务的功能,方便用户进行日常管理和维护
  • ✨️ 支持主流Linux发行版操作系统,例如centos、Ubuntu、Rocky、Debian、Rhel等
  • ✨️ 支持主流ARCH架构下部署,包括linux/amd64、linux/arm64

项目地址:https://github.com/dqzboy/Docker-Proxy

二、操作流程

  • 购买一台国外的云服务器并且没有被墙,用来搭建docker镜像仓库代理服务
  • 准备一个域名,然后原文链接:https://www.dqzboy.com到腾讯云或者阿里云上申请一个免费的证书;如果有多个代理的地址则要配置多个二级域名,然后购买一个通配符证书(说明:如果你使用cloudflare进行DNS解析,开启CF代理就不需要单独购买证书了,CF会免费提供https服务)
  • 安装Nginx,配置域名和证书,然后反代我们的Registry容器服务
  • 安装部署Docker和docker-compose

部署过程中出现的问题或者疑问,请点击这里问题总结,查看是否有你遇到的情况!尝试先自己解决。

三、基础环境安装

(1)添加YUM源

[root@proxy ~]

[root@proxy ~]

[root@proxy ~]

(2)安装 Docker

[root@proxy ~]

[root@proxy ~]

(3)启动 Docker

[root@proxy ~]

四、部署镜像仓库代理

(1)创建账号密码【可选】

配置账号密码:设置密码认证后,我们在进行拉取镜像时就需要先 docker login登入到我们的自建的代理镜像仓库,然后才可以拉取镜像

注意:执行htpasswd命令时,请把username和password修改为你自己的账号和密码

[root@proxy ~]

[root@proxy registry-proxy]

(2)添加docker-compose.yml文件

  • 如果你要开启Proxy认证的话请把 #- ./htpasswd:/auth/htpasswd 注释取消掉

[root@proxy ~]# mkdir -p /data/registry-proxy && cd $_

[root@proxy registry-proxy]# vi docker-compose.yaml

services:

dockerhub:

container_name: reg-docker-hub

image: dqzboy/registry:latest

restart: always

environment:

- OTEL_TRACES_EXPORTER=none

volumes:

- ./registry/data:/var/lib/registry

- ./registry-hub.yml:/etc/distribution/config.yml

ports:

- 51000:5000

networks:

- registry-net

## UI

registry-ui:

container_name: registry-ui

image: dqzboy/docker-registry-ui:latest

environment:

- DOCKER_REGISTRY_URL=http://reg-docker-hub:5000

- SECRET_KEY_BASE=9f18244a1e1179fa5aa4a06a335d01b2

- ENABLE_DELETE_IMAGES=true

- NO_SSL_VERIFICATION=true

restart: always

ports:

- 50000:8080

networks:

- registry-net

networks:

registry-net:

(3)添加config.yml文件

注意:每个容器挂载对原文链接:https://www.dqzboy.com应的config.yml,这里名称需要与上面compose.yml文件定义的挂载的名称保持一致(例如上面挂载的配配置文件名称为docker-hub.yml);下面只是其中一个示例配置,其他的配置也一样,只需要更改 remoteurl 代理的地址即可!

如果你上面开启了密码认证,那么下面配置中auth块的内容需要把注释取消掉!!!

[root@proxy registry-proxy]

version: 0.1

log:

fields:

service: registry

storage:

filesystem:

rootdirectory: /var/lib/registry

delete:

enabled: true

cache:

blobdescriptor: inmemory

blobdescriptorsize: 10000

maintenance:

uploadpurging:

enabled: true

age: 168h

interval: 24h

dryrun: false

readonly:

enabled: false

http:

addr: :5000

headers:

X-Content-Type-Options: [nosniff]

Access-Control-Allow-Origin: ['*']

Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE']

Access-Control-Allow-Headers: ['Authorization', 'Accept', 'Cache-Control']

Access-Control-Max-Age: [1728000]

Access-Control-Allow-Credentials: [true]

Access-Control-Expose-Headers: ['Docker-Content-Digest']

health:

storagedriver:

enabled: true

interval: 10s

threshold: 3

proxy:

remoteurl: https://registry-1.docker.io

username:

password:

ttl: 168h

(4)启动容器服务

[root@proxy registry-proxy]

[root@proxy registry-proxy]

(5)配置Nginx反代

[root@proxy ~]# cd /etc/nginx/conf.d/

[root@proxy conf.d]# vim registry-proxy.conf

server {

listen 80;

listen 443 ssl;

## 填写绑定证书的域名

server_name ui.your_domain_name;

ssl_certificate your_domain_name.crt;

ssl_certificate_key your_domain_name.key;

ssl_session_timeout 1d;

ssl_session_cache shared:SSL:50m;

ssl_session_tickets off;

ssl_protocols TLSv1.2 TLSv1.3;

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

ssl_prefer_server_ciphers on;

ssl_buffer_size 8k;

proxy_connect_timeout 600;

proxy_send_timeout 600;

proxy_read_timeout 600;

send_timeout 600;

location / {

proxy_pass http://localhost:50000;

proxy_set_header Host $host;

proxy_set_header Origin $scheme://$host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

proxy_set_header X-Forwarded-Ssl on; # Optional

proxy_set_header X-Forwarded-Port $server_port;

proxy_set_header X-Forwarded-Host $host;

}

}

## docker hub

server {

listen 80;

listen 443 ssl;

## 填写绑定证书的域名

server_name hub.your_domain_name;

ssl_certificate your_domain_name.crt;

ssl_certificate_key your_domain_name.key;

ssl_session_timeout 1d;

ssl_session_cache shared:SSL:50m;

ssl_session_tickets off;

ssl_protocols TLSv1.2 TLSv1.3;

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

ssl_prefer_server_ciphers on;

ssl_buffer_size 8k;

proxy_connect_timeout 600;

proxy_send_timeout 600;

proxy_read_timeout 600;

send_timeout 600;

location / {

proxy_pass http://localhost:51000;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Nginx-Proxy true;

proxy_buffering off;

proxy_redirect off;

}

}

# 重载Nginx配置

[root@proxy ~]# nginx -t

[root@proxy ~]# nginx -s reload

(6)解析域名

  • 将我们在Nginx配置的域名,在DNS服务商商进行解析,解析到部署镜像代理仓库的服务器上;
  • 通过访问UI地址可以查看镜像仓库缓存的镜像;
  • 通过使用对应的代理域名来下载我们之前无法下载的镜像。

(7)使用镜像仓库代理

  • 使用自建的 Registry 地址替换官方的 Registry 地址拉取镜像

#

#

docker pull hub.your_domain_name/library/nginx:latest

访问 UI 页面就可以看到上面我们下载的镜像已经被缓存了

(8)修改docker配置

  • 在docker的daemon.json配置文件中添加上docker.io的代理域名,然后重启docker程序

[root@BJ-Cloud ~]

{

"registry-mirrors": ["https://hub.your_domain_name"],

"log-opts": {

"max-size": "100m",

"max-file": "5"

}

}

systemctl restart docker

(9)kubeadm配置镜像代理

如果你用 kubeadm 部署 Kubernetes 集群,可以在 kubeadm 配置文件中设置镜像地址为你的搭建的代理仓库的域名地址

~]

apiVersion: kubeadm.k8s.io/v1beta1

kind: ClusterConfiguration

kubernetesVersion: v1.25.1

......

imageRepository: gcr.your_domain_name/google-containers


本文作者:浅时光博客
原文链接:https://www.dqzboy.com/8709.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可,转载时请以>超链接形式标明文章原始出处和作者信息
免责声明:本站内容仅供个人学习与研究,严禁用于商业或非法目的。请在下载后24小时内删除相应内容。继续浏览或下载即表明您接受上述条件,任何后果由用户自行承担。