使用 Gitlab Container Registry

前言⌗
在服务都趋向于 Go 语言化之后,遇到的第一个问题就是如何部署 Go 项目的二进制?我们一路走来爬了很多坑,总结出来的部署方式如下:
- 将二进制可执行文件直接复制到目标服务器,然后通过 Shell 脚本管理服务进程
- 将二进制可执行文件直接复制到目标服务器,通过预定义的 Service 配置文件,让 Systemd 管理服务进程
- 使用 Docker Image,在单台服务器上用 Docker CLI 管理服务进程
- 使用 Docker Image,通过容器编排与调度平台实现灰度发布
前三种方式有点是对于基础设施没啥要求,但是缺点也很明显,很难做到用户无感知的代码发布,除非在项目代码中集成一些第三方的服务注册与发现的基础设施,如 Consul 或 ETCD 等!
为了能顺利过渡到容器编排与调度,我们首先要做的就是从传统的二进制分发方式转变为 Docker Image 分发的方式,那么这就需要用到 Docker Container Registry。
对于代码管理用的是 Self-Hosted Gitlab 的团队而言,Gitlab Container Registry,是一个比较不错的选择,Gitlab 已经内置,只需要通过配置开启即可!
配置⌗
Gitlab 服务相关配置目录结构如下:
.env
配置如下:
docker-compose.yaml
配置如下:
- 第 12~32 行
labels
用于向 Traefik 注册的反向代理。 - 第 54~64 行中的配置是用于开启 Gitlab Container Registry,以及配置 Nginx 反向代理。
我在本地搭建的所有的域名都用的
.local
这个 TLD。
启动服务⌗
测试⌗
访问 Gitlab 中项目的 Container Registry 页面:
登录⌗
注意:这里如果域名不是公网可解析的域名,需要自己设置 DNS 或者设置
Docker Daemon
的 Proxy ,才能正常登录!将registry.local
替换为自己的域名。
Push Image⌗
我这里直接将 Traefik 官方的镜像重新打个 Tag 然后推送到 Gitlab Container Registry 中:
然后再来看看项目中的 Container Registry 就有了刚才 Push 的 Image:
总结⌗
这只是服务容器化迈出的第一步,要想服务能够更好的发布,还需要更强大的编排和调度系统!
I hope this is helpful, Happy hacking…