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

admin 行业动态 2024-07-26 44

摘要:前言 巧妇难为无米之炊,玩容器,“镜像”就是下锅的米,我们私有云Hulk平台的容器服务,向用户提供UI页面化的一整套的镜像定制、制作、管理、私有镜像仓库的服务,这套服务的背后技术实现,Jenkins算是“引擎”,本文简要介绍这其中的技术方案; 纯手工捣鼓Docker镜像 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 dockerfile FROM 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:

#!groovy pipeline {     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测试镜像;

相关推荐

评论列表
关闭

用微信“扫一扫”