概要
随着DevOps理念不断的传播,大部分IT从业者对于DevOps本身也有了一定的了解和认识,然而企业内部想根据DevOps思想实践,这并不是一件很简单的事情。一方面由于企业内部的历史环境以及组织结构问题,另外一方面因为业界并没有一套标准的开源工具集可以借鉴(关于几家基于Docker的服务提供商暂时除外啊)。
那么该篇内容主要讲解如何借助开源工具结合CI/CD的场景,将Docker融入到部署单元中去,进行持续集成、测试到最终的持续部署,开发人员最终只需要去关注业务的访问入口就可以知道业务是否正常,并可以通过一系列的监控工具去及时发现业务异常。
在整个DevOps部署流水线中需要以下几个部分:CI部分、CD部分、服务治理部分、监控部分、日志部分。本篇文章将通过一个简单的go-web应用去进行基于Docker的CI/CD流水线的测试。
基于Docker的CI/CD的优势
一个完整的流程入上图所示,用户(也就是开发人员)将包含Dockerfile的源码从本地push到Git服务器上,然后触发Jenkins进行构建源码,源码构建完成后紧接着进行Docker image的构建,一切构建完成之后,顺带将构建成功的image上传到企业内部的镜像仓库,到此刻为止,其实一个基本的CI(持续集成)已经算是结束,剩下的部分就是持续部署或者进行持续的交付开发产物了。在以前传统的软件发布模式中,持续集成的产物是编译打包好的代码,如果想要发布程序,发布系统需要在持续集成的制品库中去获得对应的代码,然后根据一系列的环境检查来准备应用的运行时环境,而在此过程中往往会涉及到比较多的基本组件依赖,所以在整体的发布周期内来看,还是有一些问题的。在Docker或者容器时代,我们将容器的镜像构建部分融入到持续集成(CI)环节,最终持续集成的产出物是一些已经处理好依赖关系,基本不需要人工进行二次干预的Docker image,而在CD环节,发布系统只需要设置和管理很少的信息就能够很快将image运行起来,快速地将业务发布出去。
在上面整个环节中,其实无非就是增加了Docker的那一层处理,但其实在整个软件开发的生命周期中,它是产生了极大的影响的。首先,部署系统不需要为统一的部署框架去做更多逻辑抽象,业务研发在开发代码的过程中选择自己依赖的base image即可,最终运行起来的业务也就是你当时提供的base image的模样;其次,由于base image已经处理好了相关的依赖,所以当发布系统拿到业务的image的时候,发布操作将会变得异常迅速,这对于互联网时代可谓是非常重要的;最后一点,也是我感受最深的,就是研发构建好的image可以在任何的Docker环境中run起来,研发人员不需要再关系环境一致性的问题,他们在自己本地的测试环境能够运行起来的应用,那么到生成环境也一定可以。
为什么第三点我感触比较深呢?因为以前经常有研发兄弟跑过来跟我们讲,我们代码在本地运行一切顺利,代码给你们上到生产就各种问题。所以如果在整个流程中使用Docker image来讲所有的环境固化,从此mm就再也不用担心和研发兄弟扯皮环境不一致的问题啦。
基于Docker的CI/CD的开源方案实现
(1) 自助Git服务Gogs的构建国产自助式的git服务
(2) 持续集成工具Jenkins的构建
注意:使用jenkins构建image和运行docker container这块当时是使用简单的ssh进行build、push、和run的,但jenkins本身其实是有很多plugins可以支持docker的一系列操作的,plugins的基本操作也比较简单,这里不做过多介绍。
(3) 通过配置nginx反向代理来访问Gogs、Jenkins、以及测试实例
访问jenkins.biao.com的jenkins进行构建任务:
当研发在git上重新提交了代码之后进行下一次构建:
至此,整个基于Docker的CI/CD流水线的流程基本完成,其实可以看到对于研发兄弟来说,每次的提交代码都会触发一次编译构建,并且最终会run起来一个新的container,并且直接对外服务。当然在整个过程中对于集成、发布部分演示的都比较粗浅,这里只做一个引子,对于企业内部一整套的流程运转体系来说,光有持续集成和持续部署也是远远不够的,服务上线后的基础监控以及业务的日志监控还有整个业务调度都是需要进行协同考虑的,而在Docker理念大行其道的今天,我们需要更深层次的去考虑实际场景中它带给我们的优势和劣势,并且要思考如何和当前整体系统架构进行衔接,如何去为业务研发做更好的支持。
本篇文章为前一个月实践所得,今天重新编辑整理,过程中有些标识做了修改,如有部分章节读者有疑问可以随时勾搭作者。希望有共同爱好者一起交流关于Docker方面的东西。