Jenkins和Docker在HULK的落地实践


【编者的话】巧妇难为无米之炊,玩容器,“镜像”就是下锅的米,我们私有云Hulk平台的容器服务,向用户提供UI页面化的一整套的镜像定制、制作、管理、私有镜像仓库的服务,这套服务的背后技术实现,Jenkins算是“引擎”,本文简要介绍这其中的技术方案。

【3 天烧脑式基于Docker的CI/CD实战训练营 | 北京站】本次培训围绕基于Docker的CI/CD实战展开,具体内容包括:持续集成与持续交付(CI/CD)概览;持续集成系统介绍;客户端与服务端的 CI/CD 实践;开发流程中引入 CI、CD;Gitlab 和 CI、CD 工具;Gitlab CI、Drone 的使用以及实践经验分享等。

纯手工捣鼓Docker镜像

Docker的镜像,已然成为容器镜像的事实标准,我们的容器服务也是基于Docker构建的。

手工制作Docker镜像时,大概这几步:

1、创建制作镜像的工作目录
# mkdir nginx-19-el6# cd nginx-19-el6

2、可以创建一个子目录,存放要添加到镜像中的配置文件,并组织好目录层次,最后用ADD指令统一添加到镜像中
# mkdir rootfs# tree rootfs/rootfs/
└── usr
└── local
   └── nginx
       └── conf
           ├── fastcgi.conf
           ├── include
           │   └── xxx.conf
           ├── mime.types
           └── nginx.conf

3、写一个Dockerfile
# cat dockerfileFROM r.your.domain/admin/centos-68:latest
RUN yum -y install nginx-1.9.15-5.el6 && yum clean all
ADD rootfs.tar.gz /
EXPOSE 80
ENTRYPOINT ["/usr/local/nginx/sbin/nginx"]
CMD ["-c", "/usr/local/nginx/conf/nginx.conf", "-g", "daemon off;"]

4、build镜像
# docker build -t r.your.domain/xxx/nginx-19-el6:01

5、push到镜像仓库
# docker push r.your.domain/xxx/nginx-19-el6:01

这种纯手工的方式,很明显,由于自动化程度低,工作量较大,尤其是当镜像种类、版本较多以后,而且对于不了解Docker命令、Dockerfile语法的同学,使用门槛还是比较高哦。

UI页面化、自动化地生产Docker镜像

针对上面提到的效率、使用门槛的问题,简要介绍下我们的解决方案;

在面向用户的功能方面,要解决好下面几个主要问题:
  1. 镜像内容的管理,主要是一些配置文件,比如上面的rootfs目录
  2. Dockerfile的定制、自动生成,比如定制RUN、EXPOSE、ENTRYPOINT、CMD
  3. 触发build、push,以及镜像仓库的管理


在后端的技术实现方面,我们采用下面的架构:
1.png

镜像内容管理、Dockerfile定制生成

UI页面上支持用户管理自己的配置文件(rootfs)、运行的命令(RUN)、入口程序、暴露的端口等,比如:
2.png

后台会把这些内容、信息,存储到GitLab;

Jenkins实现自动化生产线

如果用户触发“制作镜像”,会触发一个Jenkins的job,该job从GitLab拉取后,根据一个Jenkinsfile里定义逻辑“制作镜像”。

Jenkinsfile里充分利用了pipeline的语法,把一系列步骤串起来:前期检查、创建tar文件、生成dockerfile、build、push、清理。

下面是一个示例的Jenkinsfile:
#!groovypipeline {
agent any

environment {
  REGISTRY_ACCESS = credentials('xxx')
}

options {
   timeout(time: 30, unit: 'MINUTES')
}

// a list of parameters provided when triggering
parameters {
   string(name: 'registry', defaultValue: '')
   string(name: 'namespace', defaultValue: '')
   string(name: 'image_name', defaultValue: '')
   string(name: 'image_tag', defaultValue: '')
}

stages {
   stage('Verify') {
       steps {                echo "To check whether related project exists and specified tag is usable..."
           sh "xxx xxx xxx"
       }
   }

   stage('Prepare') {
       steps {                echo "To generate 'Dockerfile' and archive 'rootfs' directory..."
           sh "xxx xxx xxx"
           sh "xxx xxx xxx"
       }
   }

   stage('Build') {
       steps {                echo "To build image..."
           sh "xxx xxx xxx"
       }
   }

   stage('Push') {
       steps {                echo 'To push image...'
           sh "xxx xxx xxx"
       }
   }
}

post {
   always {            echo "Always clean up, no matter whether the building and pushing was failure or success"
       sh "xxx xxx xxx"
   }
}  

镜像仓库管理

制作好的镜像,存储于私有镜像仓库,用户在页面可以方便的管理,也可以在自己测试环境,docker pull拉取镜像、docker run测试镜像。
3.png

总结

本文主要给大家介绍了Jenkins&Docker是如何在HULK落地的,其实最初的出发点还是解决当前Docker CLI下上手使用成本高的问题。在经过WEB化和自动化之后,会大大降低业务的接入使用成本,最终助力Docker在业务的快速实践。

本文转载自公众号:HULK一线技术杂谈,ID:hulktalk,作者:ADDOPS团队王浩宇。

4 个评论

几个问题:
1. UI为什么不考虑对Docker命令封装更彻底些,比如UI配置有Dockerfile命令ADD,这样会增加用户学习成本。
2. jenkinsfile谁来写?保存在哪里?是否考虑过将其也封装起来放在git上。如果用户自己写jenkinsfile,那UI存在的价值在哪里?还会增加用户的负担。
3. UI Nginx例子中,并没有看到端口配置与指定Nginx配置文件路径。另外手工制作Docker镜像的步骤4,docker build没有指定Dockerfile。
张夏

张夏 回复 张夏

另外,可视化UI是否封装了快速构建一个Docker image,比如合并相同命令RUN、复用cache等

要回复文章请先登录注册