中国领先的IT技术网站
|
|

Hulk容器服务的镜像CI解决方案

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

作者:佚名来源:|2017-08-10 15:05

开发者大赛路演 | 12月16日,技术创新,北京不见不散


前言

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

纯手工捣鼓Docker镜像

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

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

1、创建制作镜像的工作目录

  1. # mkdir nginx-19-el6 
  2. # cd nginx-19-el6 

2、可以创建一个子目录,存放要添加到镜像中的配置文件,并组织好目录层次,最后用ADD指令统一添加到镜像中

  1. # mkdir rootfs 
  2. # tree rootfs/ 
  3. rootfs/ 
  4. └── usr 
  5.     └── local 
  6.         └── nginx 
  7.             └── conf 
  8.                 ├── fastcgi.conf 
  9.                 ├── include 
  10.                 │   └── xxx.conf 
  11.                 ├── mime.types 
  12.                 └── nginx.conf 

3、写一个dockerfile

  1. # cat dockerfile 
  2. FROM r.your.domain/admin/centos-68:latest 
  3. RUN yum -y install nginx-1.9.15-5.el6 && yum clean all 
  4. ADD rootfs.tar.gz / 
  5. EXPOSE 80 
  6. ENTRYPOINT ["/usr/local/nginx/sbin/nginx"
  7. CMD ["-c""/usr/local/nginx/conf/nginx.conf""-g""daemon off;"

4、build镜像

  1. # docker build -t r.your.domain/xxx/nginx-19-el6:01 . 

5、push到镜像仓库

  1. # 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,以及镜像仓库的管理

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

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

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

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

Jenkins实现自动化生产线

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

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

下面是一个示例的Jenkinsfile:

  1. #!groovy 
  2.  
  3. pipeline { 
  4.     agent any 
  5.  
  6.     environment { 
  7.        REGISTRY_ACCESS = credentials('xxx'
  8.     } 
  9.  
  10.     options { 
  11.         timeout(time: 30, unit: 'MINUTES'
  12.     } 
  13.  
  14.     // a list of parameters provided when triggering 
  15.     parameters { 
  16.         string(name'registry', defaultValue: ''
  17.         string(name'namespace', defaultValue: ''
  18.         string(name'image_name', defaultValue: ''
  19.         string(name'image_tag', defaultValue: ''
  20.     } 
  21.  
  22.     stages { 
  23.         stage('Verify') { 
  24.             steps { 
  25.                 echo "To check whether related project exists and specified tag is usable..." 
  26.                 sh "xxx xxx xxx" 
  27.             } 
  28.         } 
  29.  
  30.         stage('Prepare') { 
  31.             steps { 
  32.                 echo "To generate 'Dockerfile' and archive 'rootfs' directory..." 
  33.                 sh "xxx xxx xxx" 
  34.                 sh "xxx xxx xxx" 
  35.             } 
  36.         } 
  37.  
  38.         stage('Build') { 
  39.             steps { 
  40.                 echo "To build image..." 
  41.                 sh "xxx xxx xxx" 
  42.             } 
  43.         } 
  44.  
  45.         stage('Push') { 
  46.             steps { 
  47.                 echo 'To push image...' 
  48.                 sh "xxx xxx xxx" 
  49.             } 
  50.         } 
  51.     } 
  52.  
  53.     post { 
  54.         always { 
  55.             echo "Always clean up, no matter whether the building and pushing was failure or success" 
  56.             sh "xxx xxx xxx" 
  57.         } 
  58.     } 

镜像仓库管理

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

【编辑推荐】

  1. 海云捷迅:OpenStack发展渐入佳境 容器化是大势所趋
  2. 容器热潮:还在等什么?
  3. 虚拟机VS容器 安全比拼谁更胜一筹?
  4. 构建具备容器和数据镜像功能的高可用性系统
  5. 数人云@双态运维峰会共话DevOps&容器落地
【责任编辑:武晓燕 TEL:(010)68476606】


点赞 0
分享:
大家都在看
猜你喜欢

视频课程+更多

热门职位+更多

读 书 +更多

Visual C++编程从基础到实践

Visual C++ 6.0是Microsoft公司的Visual Studio开发组件中最强大的编程工具,利用它可以开发出高性能的应用程序。本书由浅入深,从基础到实...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊