0x01 前言
想让一个 Container 运行起来,Docker Image 必不可少,但某些镜像存放在遥不可及的远方,而且随着学习与测试的深入,某些服务可能需要重复重建,遇到这种情况,因为网络问题而产生的等待时间问题就会被放大。
在部署本地服务的之前需要准备一个本地 Docker Registry 服务,然后向下游 Docker 服务提供镜像源服务,在这里我选择阿里云的镜像服务作为上游。很明显,只作为代理服务器是不够的,还需要将数据保存在本地,以防 Docker Image 被多次使用。
0x02 准备
因为要将 Docker Image 缓存到本地,所以需要一台拥有大容量磁盘的虚拟机;或者使用 LVM 磁盘,以便随时扩充;还可以通过将 Docker Registry 服务部署在 Rancher 集群中并将数据保存在持久卷中,在有需要的时候拓展持久卷即可。
因为需要用到阿里云的 Docker Image 镜像服务,所以需要准备一个阿里云账号。在这里感谢阿里云免费提供这项非常有必要的服务:
我们只需要将加速器地址记下即可。我自己喜欢使用特定的版本号拉取镜像,而不是使用 Latest Tag,所以我会来到以下地址找到最新版的 Registry Tag:
最后准备 Registry 配置文件:
version: 0.1 log: fields: service: registry storage: cache: blobdescriptor: inmemory filesystem: rootdirectory: /var/lib/registry http: addr: :5000 headers: X-Content-Type-Options: [nosniff] health: storagedriver: enabled: true interval: 10s threshold: 3 proxy: remoteurl: https://xxxxxx.mirror.aliyuncs.com
在这里需要注意 proxy 部分,在默认的配置文件中,这是不存在的,需要手动添加。
0x03 部署
单机部署比较简单,就一行命令:
docker run -d -p 80:5000 --restart=always --name registry \ -v /mnt/rancher-datastore-hdd-500g-lv-1/registry-dev/registry:/var/lib/registry \ -v pwd/config.yml:/etc/docker/registry/config.yml \ registry:2.7.1
- -d:后台运行并打印该容器的 ID
- -p:将容器的 TCP 5000 端口映射到 Host TCP 80
- –restart:忽略状态码,只要容器崩溃就一直重启
- –name:为改容器名命
- -v:绑定挂在卷
- /var/lib/registry:用于镜像缓存
- /etc/docker/registry/config.yml:Registry 配置文件
- registry:2.7.1:指定 Registry 版本
完成后即可通过以下地址打开并查看 Catalog:
- http://[your server ip]/v2/_catalog
比如:
请勿照搬我的地址,我在本地做了DNS解析并且该 Registry 服务已使用多时。刚完成部署的时候应该是没有任何 Docker Image 的。
我们还可以测试本地 Registry 与阿里云镜像的通讯是否正常,比如查询 Prometheus 的 Node-Exporter:
http://registry-dev.t.com/v2/prom/node-exporter/tags/list
其中 prom/node-exporter 为 Docker Image Name,结果如下:
通过这种方式,我们可以查询目标 Image 的最新版本与可用版本,如果遇到冷门的镜像,查询时间会比较长。
当然,我们还可以将它部署在 Rancher 集群中。首先需要为 Namespace 增加一个 Persistent Volume:
然后部署一个服务:
注意!上图中我没有映射端口,因为我使用 Ingresses 服务绑定了一个自定义域名,如果你想通过 Node IP + Port 的形式访问,请配置端口映射。
完成信息填写后启动即可。
0x04 使用
单机使用可参考文章开始的阿里云截图中的命令:
# 新建文件夹 mkdir -p /etc/docker # 写入文件 tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["http://registry-dev.t.com/"], "insecure-registries": ["http://registry-dev.t.com/"] } EOF # reload daemon systemctl daemon-reload # 重启 Docker systemctl restart docker
如果使用 Rancher 的自动部署服务,则可以在主机模板中修改:
0x05 结语
因为我使用 VMware + Rancher 主机池的组合,系统使用 Rancher OS,所以系统部署和 Registry 的配置都是自动化的。如果你所使用的环境和我有所区别,请根据自身的实际情况进行调整。