基于Docker的容器化DevOps平台设计与实现

2020-02-04 06:32:48邢如意
电子技术与软件工程 2020年21期
关键词:插件镜像仓库

邢如意

(江苏联合职业技术学院徐州财经分院 江苏省徐州市 221008)

DevOps 是开发(Development)与运维(Operations)两者的组合,其思想是通过软件开发人员和IT 运维人员紧密协同工作、使用自动化工具完成软件系统的构建、测试和发布,从而提高软件发布的频率和质量[1]。在DevOps 过程中,持续集成(CI)和持续部署(CD)是基础,开发、测试和运维是三大工作内容。

持续集成是自动化开发和运维的第一步。开发人员将代码提交到代码仓库后,DevOps 平台自动从仓库拉取最新代码,然后自动执行构建(编译)和测试,并且能够将构建和测试结果及时反馈给开发人员。持续集成伴随着持续测试,能够更快更早地发现代码中的错误并及时修正,使得软件可以快速迭代,从而保证软件质量。实现持续集成需要用到版本控制软件(SVN、Git)、构建工具(Ant、Maven、Gradle)和CI 软件(Jenkins、CruiseControl)。

持续交付是在持续集成完成后,将软件发布到预生产环境或测试环境中,以便于客户进行评审,在评审通过后再部署到生产环境中,完成系统上线。如果部署到生产环境也是自动化的,也可称为这一环节为持续部署。持续部署可视为持续交付的下一环节,是指在系统在完成预生产环境评审测试后自动部署到生产环境的过程,例如App 更新升级。图1 展示了持续集成到持续部署的整个流程。

DevOps 的实施需要使用大量工具,以便于建立起从代码版本管理、构建、测试、发布和部署完整流水线(Pipeline)。在这个流水线上,需要运行多个软件或服务,这些服务的运行环境首选是Docker 容器。

Docker 是一款分布式构建、迁移和运行的开放平台,它允许开发和运维人员将应用以及依赖文件打包成一个标准化的容器,并将此容器作为软件交付和部署的标准[2]。Docker 的基本组件包括容器、镜像、注册服务(仓库)。其中容器可理解为镜像的运行状态、注册服务(仓库)为存储多个镜像的空间、镜像本质为分层的文件系统,可理解为运行环境和程序综合打包后的结果。借助Docker 可以实现开发、测试和生产环境的统一化和标准化,并且易于系统的构建、迁移和部署。Docker 容器不同于传统虚拟化软件,Docker 以Linux操作系统为基础,利用Linux 提供的namespace 机制实现资源隔离、Control Groups 实现资源限制、Union File Systems 实现镜像的分层存储和容器存储驱动。Docker 容器技术已经成为当前微服务构建的首选部署方案和云计算厂商推出的容器即服务(CaaS)搭建的事实标准。

1 平台设计

1.1 技术栈选型

DevOps 是一套方法论,不是一套工具或具体的软件。DevOps作为指导软件项目开发的一种指导思想,意在通过自动化工具提出一种产品快速迭代、交付和部署的解决方案,从而提高代码质量和适应快速变化的业务需求。DevOps 平台基于现有工具软件进行搭建,通过不同职责软件的协同配合来完成项目自动化构建等任务,形成持续集成和持续交付流水线。

DevOps 平台技术栈包括了代码仓库管理软件、自动化构建工具、代码质量检查工具、自动化测试工具、持续集成工具、产品质量管理软件、敏捷管理软件等。在选择各类软件时,要充分考虑软件的可扩展性和可集成性[3]。本文所述面向Java 语言项目的DevOps 平台使用技术栈如下:

图1:持续集成、持续交付和持续部署流程

图2:容器化DevOps 平台架构

图3:Habor 运行容器架构

(1)代码管理工具:Gitlab,开源的代码仓库管理Web 软件,使用Git 进行代码版本管理,支持wiki、问题管理、监控及持续集成与部署。Gitlab 分为社区版、企业 版和托管版。

(2)自动构建工具:Apache Maven,跨平台的软件项目管理工具,基于POM 项目对象模型配置项目构建方式,可以完成项目依赖库的统一管理、解决重复和冲突问题。开发人员只需要完成pom.xml 配置即可批量完成项目构建、报告和文档生成。

(3)持续集成工具:Jenkins,被广泛应用的独立开源自动化服务器,使用Java 语言开发的开源Web 项目,可用于项目自动构建、测试和部署。Jenkins 提供了强大的插件功能,可实现与其它CI/CD插件的功能集成。

(4)代码质量审查工具:Sonar,开源代码质量管理平台,用于管理Java 代码质量。Sonar 通过插件机制,可集成其它测试工具和代码分析工具、持续集成工具等。

(5)产品质量管理软件:JIRA,集项目计划、任务分配、需求管理、问题追踪管理的综合项目管理软件,可以与Git 等代码版本系统集成,通过插件机制还可以和IDEA 等开发工具集成。

(6)配置管理:Ansible,基于Python 开发的自动化运维工具,通过模块机制可以实现批量系统配置、批量部署、批量执行等功能。

(7)容器软件:Docker,轻量级操作操作系统级虚拟化解决方案,底层为Linux 容器LXC 技术,基于镜像分层技术可实现快速启动部署且占有用空间小。Docker 的出现为软件的统一交付提供了操作标准,且已在多个云计算公司IaaS 平台中广泛应用。

表1:DevOps 服务镜像列表

1.2 平台架构

本文所述容器化DevOps 平台方案即采用Docker 容器作为服务运行的基本单位,实现快速部署和扩展。在软件系统的测试环境和线上运行环境上均采用镜像打包、分发和运行容器方式进行。具体设计架构如图2所示。

图2 中所示Habor 镜像仓库、Gitlab 代码仓库、Jenkins 集成服务、Sonar 代码审查服务、JIRA 缺陷管理服务、预发布运行环境和线上运行环境都为Docker 容器。

图2所示架构流程具体为:

(1)开发人员提交代码到Gitlab 代码仓库,Sonar 通过插件机制与Gitlab 连接,Sonar 自动触发对所提交代码进行检测,并生成检测报告反馈给Gitlab。

(2)Jenkins 通过webhooks 机制获取到Gitlab 仓库有新的代码提交,自动拉取最新代码到本地,然后执行Maven 编译、测试、打包。Jenkins 通过插件机制与JIRA 连通,自动将测试的bug 信息发布到JIRA 系统中。

(3)Jenkins 通过插件机制与docker 服务连通,在测试完成后的代码打包为docker 镜像,并自动将镜像上传到镜像仓库。镜像上传完成后,Jenkins 执行配置脚本自动从Docker 镜像仓库中获取刚提交的镜像并运行,作为预发布容器环境。以上步骤即实现了代码从提交到镜像打包持续集成过程。

(4)测试人员或最终用户在预发布环境上进行测试,将测试结果再次反馈到JIRA 缺陷管理系统中。

(5)测试完成和评审通过后,从镜像仓库中拉取镜像部署到生产环境中。

2 平台实现

2.1 创建私有Docker镜像仓库

Docker 容器基于镜像创建,镜像存储在镜像仓库中,DockerHub 是目前最大的公有镜像仓库。在实际应用中,因为网络原因导致直接访问公有镜像仓库不稳定,因此会创建私有镜像仓库以供内部使用。创建私有镜像仓库有两种方式:

(1)使用官方registry 镜像构建;

(2)使用第三方平台搭建。

第1 种方案中官方提供镜像没有管理界面,不便于管理和维护,因此本文使用第二种方案[4]。本文使用vmware 公司开源的企业级Docker Registry 仓库项目-Harbor 搭建本地镜像仓库服务。

Harbor 以官方开源的Registry 为基础,提供了管理界面、基于角色的访问控制、AD/LDAP 集成等功能。Habor 内部共分为6 个组件,每个组件都以Docker 容器方式运行。图3 展示了Habor 运行时的容器架构。

2.2 DevOps服务容器创建

DevOps 各环节服务容器创建分为两个步骤:首先是创建运行服务容器;其次是完成服务间的集成。容器可以基于现有公有仓库中镜像创建,也可以在现有镜像基础上(通过创建dockerfile 文件)创建自定义镜像。当多个服务容器之间存在依赖或联系时,可以使用docker-compose 进行容器编排。

Docker 内核基于Linux,因此宿主机操作系统建议安装Linux发行版。本文使用CentOS7.6 作为宿主机操作系统。本文所述DevOps 平台各服务容器使用的镜像如表1所示。

服务间的集成主要包括SonarQube 与Gitlab 通过sonar-gitlabplugin 插件集成以实现有新的代码提交到gitlab 仓库时自动对代码进行审核;Jenkins 与Gitlab 通过配置Webhooks 实现有新代码提交时自动进行构建;Jenkins 与Ansible 集成主要通过配置SSH 插件通过执行Shell 代码实现远程部署;Jenkins 通过安装Docker 插件实现自动创建镜像和容器运行[5]。

3 结语

当前随着DevOps 应用逐渐深入,部分企业开始转向使用Hosted CI 解决方案,即采用专业CI 服务提供商提供的SaaS CI 平台,如flow.ci 平台等。采用Hosted CI 方案,软件开发公司不需要本地搭建DevOps 流水线,而是全程在线上进行构建配置,不仅节省了机器等硬件成本和时间成本,而且能够对所用资源进行动态调度和弹性计费。采用SaaS CI 平台能够让团队将主要精力放在开发及测试反馈上,省去了环境配置及维护烦恼。Hosted CI 方案也是初创软件技术公司建立DevOps 平台的另一选择。本文描述的基于Docker 容器构造DevOps 平台的设计与实现思路仅为一种实现方式,DevOps 作为一种思想和方法论,没有“银弹”。项目管理者应在实际应用中面向场景不同选择适合的方案,同时还要考虑团队的技能水平和管理能力,在实践中探索适合自身的DevOps 平台建设最优方案。

猜你喜欢
插件镜像仓库
仓库里的小偷
填满仓库的方法
镜像
当代党员(2020年20期)2020-11-06 04:17:52
四行仓库的悲壮往事
学生天地(2020年34期)2020-06-09 05:50:40
自编插件完善App Inventor与乐高机器人通信
电子制作(2019年22期)2020-01-14 03:16:34
镜像
小康(2018年23期)2018-08-23 06:18:52
MapWindowGIS插件机制及应用
消防设备
镜像
小康(2015年4期)2015-03-31 14:57:40
镜像
小康(2015年6期)2015-03-26 14:44:27