Docker,  Linux

如何快速搭建并使用一个Docker私有化本地仓库发布应用

一 背景说明

有些要求私有化部署应用系统的客户,不允许应用服务器直接访问公网,只有部分DMZ(Demilitarized Zone)区域的机器可以访问外网。

而我们的应用系统的docker image通常都是放在互联网上的私有仓库里,这样,我们不能在应用服务器上直接pull image并run container。

于是,有了”曲线救国”的线路来部署应用系统:

  • DMZ机器上部署docker 私有仓库;
  • 在DMZ机器上从我们的互联网私有仓库上pull image;
  • 给pull下来的image打成私有仓库地址格式的image;
  • push image到私有仓库地址;
  • 应用服务器从DMZ机器上的docker 私有仓库pull image;
  • 最后再在应用服务器上启动docker容器应用。

二 配置流程

1 DMZ主机安装启动docker

yum install docker
systemctl start docker
systemctl enable docker

2 DMZ主机创建仓库存放image路径

该路径在DMZ机器上,挂载到下一步创建的docker container里,用于存放本地私有仓库images。

mkdir -p /data/registry

3 修改DMZ主机/etc/docker/daemon.json

修改/etc/docker/daemon.json为下述内容,因为默认情况下,docker 私有仓库不允许HTTP协议push和pull images。

这里的IP地址为,DMZ机器的实际IP地址。

{
 "insecure-registries": [
   "10.248.4.8:5000"
  ]
}

4 DMZ主机重启docker服务

systemctl restart docker

5 启动container

这里docker官方提供了一个image,registry用于启动1个container,用作私有仓库。

docker run -d --restart=always -p 5000:5000 -v /data/registry:/var/lib/registry     registry

6 DMZ主机从公网私有仓库pull images

docker pull registry.cn-hangzhou.aliyuncs.com/xxx/onlyou-common-service:2022-1-26_1

通常有很多个docker images,我们可以先全部pull下来。

7 生成打tag的脚本

docker images|grep registry.cn|awk '{print "docker tag  " $1 "\:" $2 "    10.248.4.8:5000/" $1 "\:" $2 }'

输出结果类似于下述:

docker tag  registry.cn-hangzhou.aliyuncs.com/xxx/onlyou-common-service:2022-1-26_1    10.248.4.8:5000/registry.cn-hangzhou.aliyuncs.com/onlyou/onlyou-common-service:2022-1-26_1

然后,把上述输出脚本,再进行加工一下,类似于下述:

docker tag  registry.cn-hangzhou.aliyuncs.com/xxx/onlyou-common-service:2022-1-26_1   10.248.4.8:5000/onlyou-common-service:2022-1-26_1

8 给image打成新的tag

执行上述脚本的结果即可。

9 push到本地私有仓库

[root@iZ2zeffxqi2pnlas58gadrZ ~]# docker push 10.248.4.8:5000/onlyou-common-service:2022-1-26_1
The push refers to a repository [10.248.4.8:5000/onlyou-common-service]
7195d293c349: Pushed
e5262db88ace: Pushed
571ae0d6961a: Pushed
518c9e7eb326: Pushed
c3ebb2aa7787: Pushed
9c2e8b91bfa8: Pushed
c477b6c8ca45: Pushed
fa0c3f992cbd: Pushed
ce6466f43b11: Pushed
719d45669b35: Pushed
3b10514a95be: Pushed
2022-1-26_1: digest: sha256:96a21daa0b4c54e2c0db50f162c3d73fc4313bbca776d3311d4a2f603f8e1830 size: 2630
[root@iZ2zeffxqi2pnlas58gadrZ ~]#  

10 应用服务器修改/etc/docker/daemon.json

内容为跟第3步骤的内容一样,原因是,告诉docker我这个私有仓库是安全的,可以直接用HTTP协议来pull images。

11 应用服务器重启docker

systemctl restart docker

12 应用服务器从DMZ主机私有仓库pull image

重启docker之后,可以直接执行docker pull 10.248.4.8:5000/onlyou-common-service:2022-1-26_1

13 应用服务器启动应用

三小结

这里是一个简单快速的思路,注意,由于在私有化环境部署,网络不畅通的情况下,一种变通的方式,快速pull images。

待处理的问题是私有仓库没有配置HTTPS验证,留作后续再研究测试。

四 参考

https://cloud.tencent.com/developer/article/1639614

https://yeasy.gitbook.io/docker_practice/repository/registry_auth

留言