欢迎您光临本站,如有问题请及时联系我们。

Jenkins & Docker在HULK的落地实践

  女主宣言该文章出自于ADDOPS团队,是一篇具体的Jenkins&Docker在HULK的落地实践,所以大家可以结合前面的一篇入门实践文章《Jenkins & Docker 持续集成实践》来对比理解与分析。该文章先是简单介绍了传统cli下docker制作镜像的一套流程,然后给大家展示了在HULK上,是如何把这一套流程自动化,web界面化的跑起来,这样可以整体提高我们docker容器镜像管理与生产的效率。希望该文章能给大家带来一些启发。

  前言

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

  纯手工捣鼓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镜像

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

  在面向用户的功能方面,要解决好下面几个主要问题:

  镜像内容的管理,主要是一些配置文件,比如上面的rootfs目录

  dockerfile的定制、自动生成,比如定制RUN、EXPOSE、ENTRYPOINT、CMD

  触发build、push,以及镜像仓库的管理

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

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

  后台会把这些内容、信息,存储到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测试镜像;

  总结

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


来源:本文由E8运维原创撰写,欢迎分享本文,转载请保留出处和链接!