大家好,我是羊刀仙。
本期继续出一期自建Docker镜像加速,该项目基于官方 registry 一键部署Docker、K8s、Quay、Ghcr、Mcr、elastic等镜像加速\管理服务。
先说说硬性要求:
VPS服务器一台,配置不求高(1H1G足矣)但必须海外,可买可白嫖;
域名一枚,可买可白嫖,建议托管至Cloudflare(简称cf),顺便借用cf生成15年的证书。
准备工作
服务器启用前
设置防火墙开放端口,ICMP、TCP、UDP端口全部打开(个人习惯)。
通过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
一项,找到源服务器
,右侧点击创建证书
,如下图所示。
接着修改最下面的证书有效期,选择15年,其它保持默认即可,点击创建
。
创建两个记事本文件,复制下面的源证书和私钥保存,分别命名为.pem
和.key
,我这里选择以域名前缀,保存为ydxian.pem
和ydxian.key
。
密钥只会显示这一次,如果忘了存,那就吊销新建一个。
接着点击左侧栏DNS
,选择记录
,添加几个DNS记录,这里建议添加俩,docker.ydxian.love
和docui.ydxian.love
,一个作为镜像加速,一个作为UI界面。
文件准备
本文就4个文件夹,2个与证书相关。
其次是docker-compose.yaml
和config.yml
这俩,考虑到部分朋友,我直接从项目下载了放在云盘,点我获取,提取码: 8ivv。
本文我仅用到了Docker Hub,因此只需要registry-hub.yml
这个配置文件。
原本的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
目录下。
点击上传docker-compose.yaml
和config.yml
。
输入命令,确认已经上传完毕。
接着输入以下命令:
docker-compose up -d
配置Nginx
继续使用文件管理工具,把证书相关的两个文件,上传至/etc/nginx
,此位置为默认位置。
接着输入命令:
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支持,目前我觉得意义不大,这个项目后续就撤掉了。
使用方法
修改daemon.json配置
最一劳永逸的方法,SSH控制台输入命令:
vim /etc/docker/daemon.json
如图,修改成你自己的域名,重启Docker服务
部署修改命令行
原部署代码,以极简方式部署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格式必须按照下图所示,结果是验证成功,点击应用
。
接着点击左侧栏映像
-提取
,需要选择刚添加的库,还是以数据库项目mysql
测试,可以顺手把设置为默认勾选上。输入library/mysql
并提取。
添加认证
大家应该还记得上面部署文件和配置文件有被注释的认证部分:
#- ./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
此时便OK了。
本文完。
评论区