Go实战专栏的项目到这里,在功能上的开发已经全部完成,接下来我们花两节讲一下Go项目的容器化部署。
想要把让项目能在容器中运行,首先得把它打包到对应的Docker镜像里才行,而且一般公司部门中都会有类似CI、CD工具负责对项目进行构建和部署。
CI任务负责根据代码仓的tag拉取对应版本的代码,而后构建出Go项目的二进制运行文件再把运行文件打包到项目的Docker镜像中,CD任务则会把项目部署到服务K8s集群约定的地方上去运行。
那么这一节我们就来聊一聊在CI任务中怎么把我们项目指定版本的代码构建成能运行服务容器的Docker镜像,这里主要分享的还是思路,具体在CI工具中怎么配置任务还要看所使用的CI工具以及需求再做调整,有可能会跟今天给出的方案不完全一样,但是整体思路还是不会有太大偏差的。
Go项目想容器化部署需要先把项目构建打包成Docker镜像,这里分享一个可以拉取 go-mall项目不同tag版本代码构建项目Docker镜像的方法。
这里我们使用Docker的多阶段打包功能:
整个Dockerfile的明细如下:
这里我们在镜像中用ARG命令种下了两个构建参数
它们需要我们执行docker build 时把代码的tag版本号还有自己的SSH 私钥传给镜像,这样就能让Docker拉取对应版本的代码了。在Docker中拉取代码使用的是机器上的私钥(这里的机器指的是咱们自己的电脑,在公司的系统环境里就是专门做CI的机器,或者配置到Jenkins的配置项),除了用ssh key 外还可以使用 GitHub / GitLab Token作为拉取代码时的身份凭证。
docker build 命令构建镜像时我们需要使用 --build-arg
参数传递 SSH 私钥和 Git tag:
运行 dokcer build 前记得把工作目录切换到Dockerfile所在的位置
docker build \
--build-arg SSH_PRIVATE_KEY="$(cat ~/.ssh/id_rsa)" \
--build-arg GIT_TAG=c5 \
-t go-mall:v5 .
这里我们使用的是c5 这个代码版本: https://github.com/go-study-lab/go-mall/releases/tag/c5
为啥用这个版本呢,因为c6的代码在容器里运行还需要连接数据库,这个我们放到下节在K8s上运行项目上再做。
项目的镜像有了,接下来我们可以使用镜像运行容器做一下测试,运行容器的命令如下,每个参数的具体作用我都写在了注释里,一看便知。
docker run -d \ # -d 参数让docker在后台运行
-p 8080:8080 \ # 映射容器端口8080到宿主机的8080端口
-v /tmp/applog:/home/applog/ \ # 把容器里的日志目录挂载到本地电脑的/tmp/applog目录上
-e ENV=test --rm \ # 指定环境变量, 关闭容器时删除容器
--name go-mall \ # 指定容器名
go-mall:v5 # 要运行的镜像名
运行容器后,你可以使用以下命令检查容器是否正在运行:
docker ps
这个命令会列出所有运行中的容器。如果容器成功运行,你会看到类似下面的输出:
这里运行容器时我们指定的ENV环境变量是test,所以项目在启动时会加载config/application.test.yaml 配置文件。
在这个配置文件里我们设置的项目应用日志的路径是:"/home/applog/go-mall/go-mall.log"
这个目录在容器中,不过我们在运行时使用 -v /tmp/applog:/home/applog/ 把它挂载到了电脑的/tmp/applog目录下,这里我们访问一个测试接口看下效果。
直接访问c5 代码版本里的接口,然后去我们电脑的/tmp/applog 目录下验证一下成果。
可以看到容器中的应用日志能正常地收集到外部挂载的日志文件中。
本节中使用的Dockerfile以及操作命令我上传到了项目仓库的WIKI里,可直接拿来使用。