在上一个文章部署股票神器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目录都在这下面,备份并盖回去。当然,如果没挪位置,重装后自然就好了。