侧边栏壁纸
博主头像
是羊刀仙啊博主等级

闲不下来!

  • 累计撰写 70 篇文章
  • 累计创建 30 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

破解 Docker 拉取难题:超稳定国内镜像加速服务部署指南!基于Docker Registry 一键部署多方镜像加速。

羊刀仙
2024-08-16 / 0 评论 / 0 点赞 / 97 阅读 / 10077 字
温馨提示:
本文最后更新于 2024-08-16,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

大家好,我是羊刀仙。

本期继续出一期自建Docker镜像加速,该项目基于官方 registry 一键部署Docker、K8s、Quay、Ghcr、Mcr、elastic等镜像加速\管理服务。

先说说硬性要求:

VPS服务器一台,配置不求高(1H1G足矣)但必须海外,可买可白嫖;

域名一枚,可买可白嫖,建议托管至Cloudflare(简称cf),顺便借用cf生成15年的证书。

准备工作

服务器启用前

设置防火墙开放端口,ICMP、TCP、UDP端口全部打开(个人习惯)。

防火墙设置.png

通过SSH连接进入控制台,类似于NAS访问。最简单的可以使用 FinalShell ,最好是能同步支持文件管理(上传)的。

这里也推荐 WebSSH,网页操作,支持简单文件/文件夹上传,用了快一年,非常不错。

部署链接:

控制台输入以下命令:

ssh root@106.45.22.34 # 不同系统账户名不同,IP为外网或公网IP,这个要注意

sudo -i # 一般不需要,基本默认会给root

apt update # 更新软件包列表,让系统知道有哪些软件包可以更新

apt upgrade --only-upgrade # 安装所有可用的软件包更新

apt install wget curl sudo vim git -y # 安装常用软件包,Debian一般来说需要这步

接下来安装Docker,接着输入命令:

wget -qO- get.docker.com | bash # 非大陆服务器安装docker

docker -v # 确认是否安装成功及查看版本

systemctl enable docker  # 设置开机自动启动

apt install docker-compose # 安装docker-compose

docker-compose --version  #查看docker-compose版本

cf接管域名与证书申请

域名接管

请看这篇,操作很简单:

证书申请

在托管完域名后,点击进入域名,在SSL/TLS一项,找到源服务器,右侧点击创建证书,如下图所示。

创建证书.png

接着修改最下面的证书有效期,选择15年,其它保持默认即可,点击创建

点击创建.png

创建两个记事本文件,复制下面的源证书私钥保存,分别命名为.pem.key,我这里选择以域名前缀,保存为ydxian.pemydxian.key

保存密钥.png

密钥只会显示这一次,如果忘了存,那就吊销新建一个。

接着点击左侧栏DNS,选择记录,添加几个DNS记录,这里建议添加俩,docker.ydxian.lovedocui.ydxian.love,一个作为镜像加速,一个作为UI界面。

添加解析.png

文件准备

本文就4个文件夹,2个与证书相关。

其次是docker-compose.yamlconfig.yml这俩,考虑到部分朋友,我直接从项目下载了放在云盘,点我获取,提取码: 8ivv。

本文我仅用到了Docker Hub,因此只需要registry-hub.yml这个配置文件。

配置文件列表.png
原本的docker-compose.yaml内容很多,支持一键部署诸多镜像加速服务,各位各取所需,我仅以Docker Hub为例,最后修改结果如下:

version: '3'

services:
  ## docker hub
  dockerhub:
    container_name: reg-docker-hub
    image: dqzboy/registry:latest
    restart: always
    environment:
      - OTEL_TRACES_EXPORTER=none
      #- http=http://host:port
      #- https=http://host:port
    volumes:
      - ./registry/data:/var/lib/registry
      - ./registry-hub.yml:/etc/distribution/config.yml
      #- ./htpasswd:/auth/htpasswd 此处是添加认证,私用大可不自找麻烦,如果想开先划到文末有步骤。
    ports:
      - 51000:5000
    networks:
      - registry-net
  ## UI
  registry-ui:
    container_name: registry-ui
    image: dqzboy/docker-registry-ui:latest
    environment:
      # UI所关联的REGISTRY容器服务地址
      - DOCKER_REGISTRY_URL=http://reg-docker-hub:5000
      # [必须]SSH命令输入 openssl rand -hex 16 生成唯一值
      - SECRET_KEY_BASE=6b3d818294c1bec22808b811689dd3a9
      # 启用Image TAG 的删除按钮
      - ENABLE_DELETE_IMAGES=true
      - NO_SSL_VERIFICATION=true
    restart: always
    ports:
      - 50000:8080
    networks:
      - registry-net
 
networks:
  registry-net:

再来看一眼registry-hub.yml文件:

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']

# 与上面的认证有关,开启认证需要删掉#取消注释
# auth:
#   htpasswd:
#     realm: basic-realm
#     path: /auth/htpasswd

health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3

proxy:
  remoteurl: https://registry-1.docker.io
  username: 
  password:
  ttl: 168h  

服务部署

先依次输入以下命令:

mkdir -p /root/data/docker_data/docker_proxy

cd /root/data/docker_data/docker_proxy

点击右上角的文件管理,上传文件,是在/root目录下。

找到文件目录 拷贝.png
上传两个文件 拷贝.png

点击上传docker-compose.yamlconfig.yml

上传完毕 拷贝.png

输入命令,确认已经上传完毕。

确认文件上传成功 拷贝.png

接着输入以下命令:

docker-compose up -d

配置Nginx

继续使用文件管理工具,把证书相关的两个文件,上传至/etc/nginx,此位置为默认位置。

上传证书和密钥 拷贝.png

接着输入命令:

cd /etc/nginx/conf.d

vim registry-proxy.conf

将以下代码粘贴进去:

## registry-ui
server {
    listen       80;
    listen       443 ssl;
    ## UI绑定域名
    server_name  docui.ydxian.love;
    ## 证书文件
    ssl_certificate /etc/nginx/ydxian.pem;
    ## 私钥
    ssl_certificate_key /etc/nginx/ydxian.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;
    ## docker绑定域名
    server_name  docker.ydxian.love;
    ## 同上
    ssl_certificate /etc/nginx/ydxian.pem;
    ## 同上
    ssl_certificate_key /etc/nginx/ydxian.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;
    }
}

英文输入状态下,按i即可进行修改。修改完毕后,按下esc,再同时按下shift+:,英文状态输入wq并回车,即可保存。

重启Nginx和Docker服务:

systemctl restart nginx

systemctl restart docker

使用方面

web输入docui.ydxian.love即可访问UI界面,但是缺少很多API支持,目前我觉得意义不大,这个项目后续就撤掉了。

ui界面.png

使用方法

修改daemon.json配置

最一劳永逸的方法,SSH控制台输入命令:

vim /etc/docker/daemon.json

如图,修改成你自己的域名,重启Docker服务

修改docker配置 拷贝.png

部署修改命令行

原部署代码,以极简方式部署nginx为例:

docker run -d --name nginx -p 80:80 nginx

image: nginx # docker compose 部署,仅需改这里

docker pull nginx # 单纯拉取镜像

使用镜像加速后的代码:

docker run -d --name nginx -p 80:80 docker.ydxian.love/nginx

image: docker.ydxian.love/nginx

docker pull docker.ydxian.love/nginx
NAS设置

这里以威联通为例:

打开Container Station,点击左侧存储库-添加添加存储库进行验证,名称随意,URL格式必须按照下图所示,结果是验证成功,点击应用

测试链接成功.png

接着点击左侧栏映像-提取,需要选择刚添加的库,还是以数据库项目mysql测试,可以顺手把设置为默认勾选上。输入library/mysql并提取。

进行提取.png

添加认证

大家应该还记得上面部署文件和配置文件有被注释的认证部分:

#- ./htpasswd:/auth/htpasswd

# 以及

#auth:
#  htpasswd:
#    realm: basic-realm
#    path: /auth/htpasswd

输入命令将这几部分注释都取消:

cd /root/data/docker_data/docker_proxy

vim docker-compose.yaml

vim registry-proxy.conf

保存后退出,接着输入命令:

htpasswd -c ./htpasswd ydxian

# 重复输入密码两次即可

docker-compose restart

生成密码.png

此时便OK了。

本文完。

0

评论区