使用gitlab搭配阿里云容器镜像服务构建镜像

工作思路

本次北京AWS技术峰会里看到了很多公司在运维上使用容器部署和扩容的实例,一天下来感受良多。现在比较流行部署办法就是“云镜像”:即开发把新的代码提交到gitlab上,然后gitlab与云厂家的镜像服务相关联,然后每一次commit提交都会触发一次镜像的构建,然后再根据这个镜像部署到实际的服务器里,同时将此服务器作一个快照,同时再搭配上容器监控,如果服务吃紧,就用此快照购买实例扩容;如果服务闲余,那么也会自动将最老的服务器实例关机,进而释放退款。

用图像来说就是这个意思:
paradin

勾连gitlab与云镜像

本文使用的镜像厂家是阿里云,gitlab版本是10.7.3

进入阿里云的“容器镜像”页面,如果你是第一次使用这个产品需要先建立一个仓库密码,然后点击左侧的代码源,如图:
paradin

在gitlab地方选择“绑定账号”,就需要填写对应的栏目:
paradin

前两项很好写,最后一个token需要在gitlab里创建:在gitlab的页面,点击个人的头像,然后settingsAccess Tokens,填写好名字(生产环境一般都是填运维的账号)然后在api处打勾,生成的那个东东就是token,直接复制填写到阿里云的页面即可。如图:
paradin

配置镜像仓库

在阿里云容器镜像界面点击“创建镜像仓库”,填写好名字摘要仓库类型之后,在代码源里选择gitlab,由于刚刚填写了token所以是可以看得到gitlab用户下所有的project名的,如图:
paradin

然后点击新创建的那个仓库,在构建一栏默认已经选择好了“代码变更时自动构建镜像”,点击“添加规则”,如图:
paradin

这里我选择了master分支,然后指明了dockerfile文件名和路径,最后版本号就先写一个version,这个可以通过gitlab在commit时特殊指定。

右侧栏里的Webhook是用来发送提示的,可以在钉钉里创建一个机器人,在创建机器人时会生成webhook,然后把机器人的webhook添加到这个webhook即可。如果在添加的时候提示“当前请求失败,请重试”,这个情况是因为Webhook的名称里有中文,要全英文才可以。
paradin

编写dockerfile

如果没有dockerfile是无法构建镜像的,于是就在上面“规则”的目录里创建对应的dockerfile文件,注意!“规则”里的根目录就是代码文件夹的顶目录,而不是整个服务器的根目录。写dockerfile的基础知识和语法这里不多说了,网络上有的是,我就随便写一个nginx dockerfile,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
############################################################
# Dockerfile to build Nginx container images
# Based on Debian
############################################################
FROM debian:latest
MAINTAINER ChrisChan "Chris@jjfjj.com"
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get install -y vim
RUN apt-get install -y procps #安装ps命令
RUN echo 'HI!WARRIOR is the champion!!!' > /var/www/html/index.nginx-debian.html
EXPOSE 8080 #开放8080端口
COPY /file/kubernetes.tar.gz /mnt/
#CMD service nginx start && nginx -g "daemon off;"
ENTRYPOINT [ "/usr/sbin/nginx", "-g", "daemon off;" ]

注意!使用上面注释的CMD语句作为结尾的话,那么这个镜像docker run的时候就会马上退出,这是因为把command做为容器内部命令,那么nginx程序将后台运行,这个时候nginx并不是pid为1的程序,而是执行的bash,这个bash执行了nginx指令后就挂了,所以容器也就退出了。简而言之,Docker容器后台运行,就必须有一个前台进程。因为Docker容器仅在它的1号进程(PID为1)运行时,会保持运行。如果1号进程退出了,Docker容器也就退出了。

在gitlab触发之后,阿里云就自动把这个dockerfile build成了镜像保存在阿里云的容器仓库里,如图:
paradin

想用这个镜像就可以直接去阿里云的仓库里下载并启动,这样就节省了本地的硬盘容量。最后就是把这个镜像部署到对应的kubernetes集群里,这样就完成了“gitlab代码提交触发阿里云构建镜像”的过程,而如何使用kubernetes的内容将在以后细说。

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------