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 的配置都是自动化的。如果你所使用的环境和我有所区别,请根据自身的实际情况进行调整。