前言巧妇难为无米之炊。玩容器时,“镜”就是煮饭的饭。我们私有云Hulk平台的容器服务,为用户提供一整套基于UI页面的镜像定制、生产、管理、私有镜像仓库服务。这套服务背后的技术实现,Jenkins算是“引擎”。本文简要介绍技术方案;纯手工修补Docker镜像Docker镜像已经成为容器镜像的事实标准,我们的容器服务也是基于Docker构建的;手动制作Docker镜像时,大致有以下步骤:1.创建制作镜像的工作目录#mkdirnginx-19-el6#cdnginx-19-el62。可以创建子目录存放要添加到镜像中的配置文件,并整理好目录层次,最后使用ADD命令统一添加到镜像中#mkdirrootfs#treerootfs/rootfs/└──usr└──local└──nginx└──conf├──fastcgi.conf├──include│└──xxx.conf├──mime.types└──nginx.conf3,写一个dockerfile#catdockerfileFROMr.your.domain/admin/centos-68:latestRUNyum-yinstallnginx-1.9.15-5.el6&&yumcleanallADDrootfs.tar.gz/EXPOSE80ENTRYPOINT["/usr/local/nginx/sbin/nginx"]CMD["-c","/usr/local/nginx/conf/nginx.conf","-g","daemonoff;"]4、构建镜像#dockerbuild-tr.your.domain/xxx/nginx-19-el6:01.5,推送到镜像仓库#dockerpushr.your。domain/xxx/nginx-19-el6:01这种手动方式,很明显,由于自动化程度低,工作量大,尤其是镜像类型和版本比较多的时候,以及对docker命令不了解的同学而dockerfile语法,使用门槛还是比较高的;UI页面自动生成Docke针对上面提到的效率和使用门槛的问题,r镜像简单介绍一下我们的解决方案;在面向用户的功能方面,主要需要解决以下几个问题:镜像内容的管理主要是一些配置文件,比如上面rootfs目录下dockerfile的自定义和自动生成,比如自定义RUN、EXPOSE、ENTRYPOINT,CMD触发镜像仓库的构建、推送和管理在后端技术实现上,我们采用如下架构:镜像内容管理,dockerfile自定义生成UI页面支持用户管理自己的配置文件(rootfs),运行命令(RUN)、入口程序、暴露的端口等。例如:后台会将这些内容和信息存储在GitLab中;Jenkins实现自动化生产线,如果用户触发“镜像”,就会触发一个Jenkins作业。Job从GitLab拉取后,会按照Jenkinsfile中定义的逻辑“做一个镜像”;Jenkinsfile充分利用pipeline的语法将一系列步骤串联起来:pre-check,Createtarfile,generatedockerfile,build,push,clean;这是一个Jenkinsfile示例:#!groovypipeline{agentanyenvironment{REGISTRY_ACCESS=credentials('xxx')}options{timeout(time:30,unit:'MINUTES')}//alistofparametersprovidedwhentriggeringparameters{string(name:'registry',defaultValue:'')string(name:'namespace',defaultValue:'')string(name:'image_name',defaultValue:'')string(name:'image_tag',defaultValue:'')}stages{stage('Verify'){steps{echo"查看相关项目是否存在,指定tag是否可用..."sh"xxxxxxxxx"}}stage('准备'){steps{echo"Togenerate'Dockerfile'andarchive'rootfs'directory..."sh"xxxxxxxxx"sh"xxxxxxxxx"}}stage('Build'){steps{echo"Tobuildimage..."sh"xxxxxxxxx"}}stage('Push'){steps{echo'Topushimage...'sh"xxxxxxxxx"}}}post{always{echo"Alwayscleanup,nomatterwhetherthebuildingandpushingwasfailureorsuccess"sh"xxxxxxxx"}}镜像仓库管理创建的镜像,存储在私有镜像仓库中,用户可以在页面上方便的管理,也可以在自己的测试环境中,dockerpull拉取镜像,dockerrun测试镜像;
