在上一个文章部署股票神器instock过程中,虽然作者提供了打包好的镜像文件,但是不想使用,想自己拉取。但是又想起之前自己群辉的docker套件中的注册表功能基本用不了,每次都是自己通过命令行的方式拉取镜像,这需要提前把网关改到旁路由且拉取十分的不稳定。虽然也有别人搭建的镜像加速服务可以使用(诸如https://dockerpull.org/),但是考虑到安全性,还是决定自己搭建。
服务搭建
作者这里选择在云服务上自己搭建,虽然也有用CF的work搭建的方法(利用Cloudflare Workers搭建Docker镜像加速服务).
1.下载config目录下对应的yml
文件到云服务器上。我这里只需要docker-hub.yml,也可直接新建文件插入以下代码
version: 0.1
log:
fields:
service: registry
storage:
filesystem:
rootdirectory: /var/lib/registry
#inmemory: #此存储驱动程序不会在运行期间保留任何数据,适合磁盘空间下的机器使用(但是会使用内存开销,只适合测试)
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
2.docker-compose.yaml文件编辑
version: '3'
services:
## docker hub
dockerhub:
container_name: reg-docker-hub
image: dqzboy/registry:latest
restart: always
environment:
- OTEL_TRACES_EXPORTER=none
# 如果需要配置代理,请把下面的注释去掉,并配置你的代理地址
#- http_proxy=http://host:port
#- https_proxy=http://host:port
volumes:
#这里需要注意registry-hub.yml文件的具体路径
- /docker/docker-proxy/registry/data:/var/lib/registry
- /docker/docker-proxy/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容器服务地址,这里我是后来才更改的,原来是ip:端口的模式
- DOCKER_REGISTRY_URL=https://hub.daoker.cc
# [必须]使用 openssl rand -hex 16 生成唯一值
- SECRET_KEY_BASE=9f18244a1e1179fa5aa4a06a335d01b2
# 启用Image TAG 的删除按钮
- ENABLE_DELETE_IMAGES=true
- NO_SSL_VERIFICATION=true
restart: always
ports:
- 50000:8080
networks:
- registry-net
networks:
registry-net:
3.在NPM里将域名反代至相关端口
可视化页面:ui.daoker.cc
加速地址:hub.daoker.cc
使用方法docker pull hub.daoker.cc/library/nginx:latest
library必须有,github上有省略的办法,但是在npm的规则编辑里没有成功,先凑合用。
所遇问题及解决方案
1.添加hub.daoker.cc/library至黑群晖docker中的注册表加速地址后,导致docker套件直接无法使用
(1)查看日志文件/var/log/upstart/pkg-Docker-dockerd.log
发现是我改的加速地址惹得锅。在docker服务要启动sock的时候,因为无法加载json配置文件失败,json文件有错
(2)编辑配置文件/var/packages/Docker/etc/dockerd.json
删除registry-mirrors的值,如下所示,只保留[]
{
"data-root" : "/var/packages/Docker/target/docker",
"log-driver" : "db",
"registry-mirrors" : []
}
(3)到套件中心启动docker,成功搞定
2.在黑群辉上使用自建的加速地址拉取镜像,返回x509: certificate signed by unknown authority,其它系统环境上并没有此问题
真正的解决方案是更新系统的ca证书,从letsencrypt.org网站中获取证书更新到系统中
sudo -i && cp /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt.ORIG && curl -k "https://letsencrypt.org/certs/isrgrootx1.pem" >> /etc/ssl/certs/ca-certificates.crt && reboot
3.找资料时发现的小tips,留着以后备用
(3) docker的容器镜像如何迁移到其他设备?
解答:
群晖的docker管理界面里,容器-设置-导出-可以选择导出内容和设置,以及只导出设置。导出后是一个txz文件,例如transmission挂了几百个种,想迁移设备咋办?如果不拔盘整个迁移的话,可以用这个功能导出容器,在其他设备docker直接导入即可。(注意data目录、config目录要重新配置)
(4) 重点干货来了,如果我手贱卸了docker,例如我这次为了定位,卸载、重装了docker几十次(当然卸载时没勾选干掉容器镜像和数据),且没做提前做容器导出备份(docker都启动不了,导出个毛啊),此时我怎么恢复docker数据?
解答:
首先,在你原来docker的存储空间位置装上docker,此时注意存储空间下会有2个目录,如果你都被挪,自然就好了。如果要无界面备份的话,我再说说这两个目录作用:
目录1:存储空间下@docker目录
你有多少个容器,容器的文件、docker本身的配置,各类数据都在这里面,卸载时这个目录不会被清空,所以安装后就回来了。如果在docker无法启动时要备份docker数据,第一就是备份这个目录,今后在其他地方安装后,把这个目录的东西盖回去。
目录2:存储空间下docker目录这是一个共享文件夹,各容器的config、data目录都在这下面,备份并盖回去。当然,如果没挪位置,重装后自然就好了。
DmbZNKYVbVJ
LZZzglnIXUk
MhgWj1IGYoB
RlibQGKLr43
oy72qcDQNbM
9wwuoBVPjzf
I5yPhMQhsAK
tNFF3FRMgy3
TD4P6ZV0IY2
5u2RD2hxFWv
hzpQhPp4ZfC
POcvRHmLhtO
P6wYFYyOqIt
WumMp8MNBKz
dVT8X0rVELe
FzhZKQK38wS
6dQLXDjc9Gs
zxuPjpCKsth
lwBfz8v2sNx
O4GoOpCy1Xu
MZNh6QGAHDe
EUtNPHhSdeG
TapMtXEkV51
cAvlvRhkS6V
3YH2s0MoGne
yEu4VeW9c2G
MtYARjgS0YJ
mjIDDH1kNqq
IQYLg7Nqapq
s2EXTiZ2HzR
znHFDYTXZNT
gARwCBwv1O1
AKwyaAuqAXL
3YMmp6r5mAB