指挥信息系统与技术
Command Information System and Technology
Vol.8 No. 3
Jun.2017
•实践与应用• doi: 10. 15908/j. cnki. cist. 2017. 03. 017基于Docker的D e v O p s系统设计与实现
丁海斌崔隽陆凯
(中国电子科技集团公司第二十八研究所南京210007)
摘要:首先,介绍了Docker与DevOps的特点;其次,针对传统持续集成发布的问题,阐述了基于Docker构建的DevOps系统的特点与优势;再次,描述了该系统设计的总体架构、具体实现和运作流程;最后,给出了该系统的应用模式。
关键词:持续集成;Docker; DevOps; Kubernetes; Jenkins
中图分类号:TP391 文献标识码:A 文章编号:1674-909X(2017)03-0087-06
Design and Implementation of DevOps System Based on Docker
DING Haibin CUI Jun LU Kai
(T he 28th Research Institute of China Electronics Technology G roup C orporation, Nanjing 210007, China) Abstract:Firstly, the characteristics of Docker and DevOps are introduced. Secondly, aimed at the problems of traditional continuous integration (Cl) and continuous distribution (CD), the features and advantages of DevOps system based on Docker are introduced. Then, the architecture of the system design, the specific implementation and operational process are described. Finally, the application mode of the system is given.
Key words:continuous integration (Cl);Docker;DevOps;Kubernetes;Jenkins
〇引言
当今I T部门常存在这样的矛盾:敏捷开发者 希望快速部署常规软件,运维团队则优先考虑稳定 性。开发和运维团队各自有的目标,2个团队 缺乏有效沟通,使问题更加复杂:开发团队难以觉察 目标环境变化,运维团队则不清楚开发团队在做什 么。为了维持平衡,使I T部门恢复正常运行状态,跨职能部门需采用D ev O p s方法,以消除2个团队 间的分歧。这意味着运维团队需从幕后走到台前,帮助提高应用的质量,尤其是那些正在开发、测试和 部署的应用[1]。
Docker是一个分布式应用构建、迁移和运行的 开放平台,它允许开发或运维人员将应用及其运行 依赖的文件打包至一个标准化容器运行。将Dock-收稿日期=2016-12-23e r引人持续集成发布系统,可实现快速部署和通过
镜像共享工程环境功能,使得开发、测试和运维能够 实现环境复用和一键化部署,从而对实现DevOps 提供有利支撑。
1 Docker 与DevOps
1. 1 Docker 简介
1. 1. 1概念
Docker是一个开源平台,它包括容器引擎和 Docker H ub注册服务器。其中Docker容器引擎可 以让开发者打包其应用和依赖包至一个可移植的容 器,然后将其发布至任何Linux机器。Docker Hub 注册服务器让用户可在该服务器上创建自己的镜像 库来存储、管理和分享镜像。利用Docker,可实现
软件的一次配置和随处运行。
引用格式:丁海斌,崔隽,陆凯.基于D ock er的D evO ps系统设计与实现[J].指挥信息系统与技术,2017,8(3):87-92.
DING H aibin, CUI Jun, LU Kai. Design and im plem entation of DevOps system based on D ocker[J], Command Inform ation System and Technology, 2017,8(3) :87-92.
指挥信息系统与技术2017年6月
1. 1. 2 Dockerfile 构建键像
Dockerfile 为快速构建容器镜像而设计,所有 应用需部署至容器,通过编写相应的Dockerfile 并 执行其指令从而构建一个虚拟容器,实现快速部署。 一般情况下,Dockerfile 由基础镜像信息、维护者信 息、镜像操作指令和容器启动指令4部分组成。本 文涉及的Jenkins (开源软件项目,
旨在提供一个开 发易用的软件平台,使软件的持续集成变成可能)和 GitLab (用于仓库管理系统的开源项目)等容器镜像 均可基于Dockerfile 实现。
将需要对镜像进行的操作全部写人一个文件, 然后使用Docker Build 命令从该文件创建镜像。该 方法可使镜像创建变得透明和化,且创建过程 可重复执行。Dockerfile 文件以行为单位,行首为 Dockerfile 命令,命令均为大写形式,其后紧跟命令 参数[2]。在Dockerfile 中每条指令均会创建一个新 的镜像层并提交镜像。Docker 按以下流程执行 Dockerfile 中指令:
1) Docker 从基础镜像运行一个容器;
2) 执行一条指令,对容器做出修改;
3) 执行类似Docker Commit 的操作,提交一个 新的镜像层;
4) Docker 基于刚提交的镜像运行一个新容器;
5)
执行Dockerfile 中下一条指令,至所有指令
执行完毕。
执行Docker Build 命令时,Dockerfile 中所有 指令均会执行且提交,在该命令成功结束后返回一 个新镜像。
1.2
DevOps 简介
维基百科对DevOps 解释如下:DevOps (Devel -
opment 和Operations 的组合)是一组过程、方法与 系统的统称,用于促进开发(应用程序/软件工程)、
技术运营和质量保证(QA )部门间的沟通、协作与 整合。DevOps 的核心理念在于生产团队(研发、运 维和QA )间的高效沟通协作,以解决以下常见问 题[3]:
1) 更小或更频繁的需求变更;
2) 生产环境不受开发人员控制;
3) 业务以应用程序为中心,而非基础设施;4)
定义简洁明了的研发部署流程需要更多成
本与时间;5) 研发部署流程无法彻底自动化;
6)
现有平台即服务(PaaS )虚拟机难以促成开 发与运营的协作。
2 Docker 对持续集成发布的性影响
2. 1
Docker 实现DevOps 的优势
当Docker 引人持续集成构建系统时
,一
切发生
了性变化。由于Docker 具有快速部署和通过 镜像共享工程环境的功能,使得开发、测试和运维团 队能够复用工程环境,从而形成开发、测试和运维一 键部署的基础。目前,国内外已有很多公司发布了
基于Docker 容器技术的开发、测试和运维一站式解 决方案。同时,与Docker 相关的编排管理工具(如 Kubernetes 等)也在不断完善[4],使得Docker 在测 试领域得到广泛应用。
与传统DevOps 相比,Docker 实现DevOps 主 要优势如下:
1)
开发、测试和生产环境的统一化和标准化:
镜像作为标准交付件,可在开发、测试和生产环境中 以容器运行,最终实现3套环境中的应用及其运行 依赖内容的完全一致。
2) 解决底层基础环境的异构问题:基础环境的 多元化导致从D ev 到O ps 过程中出现阻力,而使用
Docker Engine (提供了 Docker 创建镜像和运行容 器等核心方法)可无视基础环境的类型。不同的物
理设备、虚拟化类型或云计算平台,只要是运行了
Docker Engine 的环境,最终应用均会以容器为基础 提供服务。
3) 易于构建、迁移和部署:Dockerfile 实现镜像 构建的标准化和可复用,镜像本身的分层机制也提 高了镜像构建效率。使用容器仓库(Registry )可将 构建好的镜像迁移至任意环境,而且环境部署仅需 将静态只读的镜像转换为动态可运行的容器即可。
4)
轻量和高效:与需封装操作系统的虚拟机相
比,容器仅需封装应用及其依赖文件即可实现轻量 的应用运行环境,且拥有比虚拟机更高的硬件资源 利用率。
5)
工具链的标准化和快速部署:将实现De
vOps 所需多种工具或软件进行 Docker 化后 ,可在 任意环境实现1条或多条工具链的快速部署。
本文设计的基于Docker 的DevOps 系统优点 如下:
1)
标准化:使用镜像和容器分别标准化了业务
的集成和交付环节,统一了产品开发交付的工作流
程;标准化的生产测试环境避免了开发测试过程中
环境不统一的问题。
2) 智能化:持续集成将代码集成智能化,代码
第8卷第3期
丁海斌,等:基于Docker 的DevOps 系统设计与实现
推送自动构建;自动化运维提供智能的状态反馈和 健康检查功能;智能化监控及时了解业务和主机运 行状况,发现潜在问题。
3) 全面:覆盖集成、部署、运维和监控等每个产 品的研发运维环节,一步到位,省心省力。
4) 快速:可实现s 级构建和部署,提高开发交
付效率;快速升级回滚和扩容缩容,使业务能够快速
迭代和弹性伸缩;便捷的页面操作和规范的使用流
程使用户可快速上手,提高工作效率。
2. 2开发、测试和发布一体化
通过Docker 提供的虚拟化方式,可快速建立一
套可复用的开发环境,以镜像形式将开发环境分发 给所有开发人员,达到简化开发环境搭建过程的目
的。Docker 以镜像和在镜像基础上构建的容器为 基础,以容器为开发、测试和发布单元,所有与该应 用相关的依赖均在容器里封装,移植方便,避免了应 用在不同平台间迁移带来的依赖性问题,确保了应 用在生产环境各阶段达到高度一致的实际效果[3]。 同时,也为应用作战系统快速实现联合作战一体化 打下坚实基础[5]。2种开发模式下流程比较如图1 所示。
图1 2种开发模式下流程比较
3系统设计与实现
3.1设计概述
通过编写原生的Dockerfile 构建Docker 容器
镜像,需相应人员熟悉一系列Linux 操作系统及
Docker 相应命令,操作较复杂。因此,本文系统开 发了一套图形化W e b 页面,通过W ebssh 和 MySQL 数据库实现了 Docker 容器镜像、容器集
群、持续集成和持续发布的流程图形化操作,极大简 化了操作流程。同时,为了有效解决原生Docker 网 络负载有限、每次重启后容器I P 发生变化等问题,
本文系统通过集成Kubernetes(Google 开源的容器 集群管理系统)及Flannel 网络插件(Flannel 是针
对
Kubernetes 设计的一个覆盖网络工具)实现
Docker 集群管理、容器编排及虚拟网络桥接。其 中,Kubernetes 通过 pod(Kubernetes 中有关 Docker 的最小封装格式) 对 Docker 容器进行封装 ,实现 了基于标签(label)的服务注册发现机制,通过与 Ngnix(—个强大的高性能超文本传输协议(HTTP) 和反向代理服务器) 有机结合,较好解决了 IP 变化漂移及负载均衡问题。该系统还将Jenkins 和 GitLab 相应组件通过统一管理页面制作成虚拟容 器镜像,同时可根据项目实际情况进行集群扩展。 而统一集成编译镜像极大解决了开发、测试和运维 依赖的环境不一致问题,通过对各类依赖环境的容 器化运营,平稳保证了开发、测试和运维依赖环境完 全一致。该系统关键动作如表1所示。
表 1 基于
D ocker 的DevO ps 系统关键动作
动作____________________能
力__________________
用来生成应用程序包、配置文件和安装/部署脚本等,
维护程序包的版本
根据应用系统的拓扑、应用依赖平台、软件包和配置 文件(脚本)等依赖关系进行架构编排和动作设置根据编排控制文件进行实例化部署,完成环境设置、 平台配置、软件安装与配置更新等胃定义不同阶段的配置行为,解析配置模板,自动进行 依赖解析,完成应用系统配置
3.2核心设计
本文系统主要由etcd (应用于分布式环境的键/ 值(key /value )存储服务)数据库集群、网络与域名 系统(DNS )组件、容器私有仓库(Docker Registry )、 Kubernetes 集群、Jenkins 、GitLab 、统一集成编译、 N gnix 负载均衡及W eb 管理页面9大模块组成,容
器的虚拟网络集成了 Flannel 插件。其中,etcd 数 据库集群提供高可用配置中心能力;网络与D N S 组 件通过 Kube 2sky 与 SkyDNS(Kubernetes 用于服 务发现的默认开源D N S 服务)2个容器镜像实现主 机与Kubernetes 及Docker 间的域名解析,通过 Flannel 容器插件构建网桥网络;Docker 为构建各 类镜像提供支撑,Docker Registry 完成各类容器镜 像的存储与管理;Kubernetes 负责Docker 容器的 集群管理与调度;Jekins 实现持续的软件版本发布/ 测试;GitLab 负责对源码的管理与配置;统一集成 编译镜像负责对所有集成环境统一配置,实现统一
编译;N gnix 实现调度的负载均衡。基于Docker 的 DevOps 系统组成如图2
所示。
90指挥信息系统与技术2017年6月
图2基于
D ocker 的DevO ps 系统组成
基于Docker 的DevOps 系统核心模块设计 如下:
1)
数据库集群:etcd 数据库采用分布式且一致
的key -value 存储,本文系统用来提供可靠的共享 存储服务,存储Kubernetes 集群和Flannel 网络插
件的配置信息。
2) 网络管理:分为容器网络和容器服务DNS 解析2部分。在容器网络管理部分,为了更好解决 跨主机容器间网络通信问题,简化网络配置和管理, 本文系统使用Flannel 提供网络管理,在运行过程 中每台宿主机创建一^个虚拟网卡,问时运彳了 一^个 Flanneld 服务,用来封装、转发和解包传输控制协议 (TCP )数据包,从而实现容器间网络连接,并使集群 中不同节点主机创建的Docker 容器均具有全集群 唯一的虚拟I P 地址;在D N S 解析部分,利用 Kube 2sky 插件监控 Kubernetes 中 service (真实应 用服务的抽象)、端点(endponit )、pod (若干相关容 器的组合)和子节点(node )的变化,将I P 地址和域 名的对应关系写入etcd 数据库,集群中SkyDNS 从 etcd 数据库中读取这些关系进行解析。
3) 核心镜像Jen k in s 镜像用于构建Jenkins 服 务,进行源代码的构建编译;G itLab 镜像用于构建
GitLab 服务,进行源代码的管理;统一集成编译镜
像,作为构建项目镜像的容器,该镜像中安装了构建
镜像所需各种依赖,确保了在构建所需项目镜像时
环境的统一,提高了构建速度,无需进行额外依赖的
下载。4) Kubernetes 框架构建:Kubernetes 集群由 主节点(master )和node 构成。master 作为控制节 点进行容器管理;node 是运行容器的节点。master 通过发送控制指令,使得n 〇d e 自动从仓库中获取镜 像,运行容器。本文系统通过给node 标签方式对生 产和测试环境进行隔离,使所有测试镜像在测试节 点运行,确保节点单一性,减少稱合。
5) Docker 私有仓库构建:用于存放构建的镜 像,需要使用时从中拉取所需镜像。
6) 负载均衡:确保统一页面管理模块的高 可用。
7)
统一页面管理:简化用户操作流程,为用户
提供可视化操作界面。
3 • 3
Docker+Jenkins 构建
Dockerfile 是实现构建Jenkins 镜像与GitLab
镜像的核心,下面通过注释说明Dockerfile 主要内 容(仅保留核心部分)的方式,介绍如何通过Dock - erHle 构建Jenkins 镜像与GitLab 镜像。
1)利用 Dockerfile 构建 Jenkins 镜像
材基础镜像
FRO M openjdk : 8-jdk
材更新apt
RU N apt-get update &• &• apt-get install -y git curl &• &• rm -rf /v a r/lib /a p t/lis ts/ *
材配置环境变量
EN V JE N K IN S_H O M E /var/Jenkins_hom e EN V JEN K IN S_SL A V E_A G EN T_PO R T 50000 #配置构建变量(该变量最后不会被保存到构建的镜像
中)
ARG user = Jenkins ARG g ro u p s Jenkins ARG u id = 1000 ARG g id = 1000 材创建Jen k in 用户
RU N groupadd -g $ {gid} $ {group} &• &• useradd -d " $ JEN K IN S_H O M E 〃-u $ {uid} -g $ {gid} -m -s /b in /b ash $ {user}
神设置挂载点
V O LU M E /var/Jenkins_hom e
RU N m kdir -p /u sr/sh a re /Je n k in s/re f/in it. groovy, d
EN V TIN I_V ER SIO N 0. 9. 0EN V T IN I_S H A fa23dle20732501c3bb8eeeca423cac 80ed452
RU N curl -fsSL https ://g ith u b. co m /k rallin/tin i/re
lease/dow nload/v $ {T IN I_V E R S IO N }/tini-static -o /b in /
tini && chmod ~hx /b in /tin i && echo 〃
T IN I_SH A 〃 /b in / tini 〃|s h a ls u m -c -COPY init. groovy /u sr/sh a re /Je n k in s/re f/in it. groovy, d/tcp-slave-agent-port. groovy ARG JEN K IN S_V ER SIO
N
A R G JE N K IN S_V E R SIO N$ {JE N K IN S_V E R SIO N:-2,19.2}
ARG JEN K IN S _ SH A=32b8bdla86d6d421423154S 543523452
ARG JE N K IN S_U R L=h ttp S|//re p〇/Jenkins-ci. org/ public/org/Jenkins-ci,/m ain/Jcnkins-w ar/{ JEN K IN S _ V ERS IO N}/Jenkins-w ar-f {JEN K IN S_V ERSIO N}:, war 材获取Je n k in s的w a r包
RU N curl -fsSL $ { JEN K IN S_ U R L}-〇/u sr/s h a re/ Jenkins/Jenkins. w ar &&e c h o$ { JE N K IN S_ S H A}} us.r/sharc/Jenkins/Jenkins, w ar” |shalsum-c -
EN V JEN K IN S_U C h ttp s://u p d a te s. Jenkins, io
RU N chown -R $ {_e r}'$ JE N K IN S_H O M E〃/u s r/ share Jenkins/ref
# 暴露 1080 50000 端口
EX PO SE 8080
EX PO SE 50000:
E N¥COPY _ R EFER EN C E _ FILE _ LOG M Y M JEH- K lN S_H O M E/copy_referernce“file. log
USER $ {user}
#设置容器启动时,自动启动Jenkins:
COPY Jenkins-vsupport /usr/local/bin/Jenkins-support
COPY Jenkins, sk /u sr/lo cal/b m/Jenk in s. sh
E N TR Y PO IN T C V bin/tini",〃uSri%ca l/b in/:fen- kins. sh〃]
COPY plugins, sh /iisr/loeal/bin/plug in s. sh
COPY install-plugins, sh /usf/locaL bin/install-plugins. sh
2)利用Dock—构建GitLab镜像
材基础镜像
FRO M ubuntu:16. Q4
神作者
M A IN T A IN ER xx "xx@163. com"
#安装|些所需要的包
RU N apt-get update -q &暮D EBIA N_ FR O N TED = noninteractive apt-get install -yq —no-install-recom m ends ca- certificates openssh-server w get apt-transport-hhtps vim iaano patch
git-annex &,&« rm-rf /v a r/lih/a p t/lis ts/ *
RU N rm -rf /ctc/updatc-m otd. d /e tc/m o td/ctc/m otd. dynamic
RU N In -fs:/d ev/n u ll /run/m otd. dynamic
材把安装包复制到构建镜像
COPY R ELEA SE /
COPY assets/ /a sse ts/
#进行安装
RU N/a ssets/setu p
材配置环境变量
EN V P A T H /o p t/G itL a b/e m b e d d e d/b in Jo p t/G itL a b/
b in:/a ss e ts: $ PA T H
EN V TER M xterm
神指明容器对外暴露的端口
EX PO SE 443 80 22
神在镜像里创建指定路径的挂载点
V O LU M E [#/etc/G itL ab〃,"/V ar/opt/G itL ab〃,#/v a r/
log/G itL ab,/]
#设置容器启动时运行启动命令
CMD [,r/assets/w rapper^]
3.4运作流程
DevOps最好的诠释是将编程思想运用于运维
领域,本文系统就利用了当前热门的Docker与Kubernetes等技术来实现DevOps,其运作流程如图
3所示&
Docker镜像和Compose模板
用于集成测试和部署 拉取镜像
图3基于D ocker的DevO ps系统运作流程
本文系统主要运作流程如下:
1)开发者向源代码管理GitLib/svc提交代码;
2) GitLib通过 Webhook通知 Jenkins有更新;
3) Jenkins从 GitLib下拉最新代码、Dockerfile
及其他文档;
4) Jenkins在錬云.云镜像服务(构建与存储Docker镜像,形成模板,用于集成、测试和部署)的node构建Docker镜像;
5) Jenkins在錬云,云镜像服务的node实例化 Docker镜像,并执行测试代码;
6)如测试通过,贝l j Jenkins推送Docker镜像到 仓库;
7)持续发布服务CD server,通过配置管理向 测试和生产等环境发布相应产品。
4应用模式示例
假定一个有1〇〇人左右的软件企业,使用Java
为开发语言,使用Tomcat为中间服务器,后台数据
使用M ySQ L和Oracle。在使用Docker前,开发到
测试的传统持续集成流程如图4
所示。
92指挥信息系统与技术2017年6月
使用一个新的Java类
完成一个新功能开发,
完成本地_丨式、push 后下班
本地环境开发人员提交的代码
无法执行,功能一点
就出错
测试服务器与生产
服务器不一致,测试
做的事到了运维部门
还需重做一遍
\\/生产服务器
Ngnix
Tomcat
MySQL/Oracle 测试部署服务器
Ngnix
Tomcat
MySQL/Oracle
图4传统的持续集成流程
由于开发、测试和运维的环境不一样,导致相应 部门做了很多重复工作,而基于Docker的DevOps 系统较好解决了该问题。基于Docker的DevOps 流程如图5所示。
图5 基于D ocker的DevOps流程
5结束语
鉴于当前互联网企业对商业机会敏感性增强,对产品的持续集成与快速交付能力越来越重视。DevOps作为敏捷开发的一种重要方,已在各
大知名互联网企业广泛推广。随着Docker、Kuber-netes和Jenkins等开源技术日益成熟与广泛应用,
使得构建一套先进的DevOps系统已不再是难题。
本文提出的基于Docker的DevOps系统正是将 Docker等先进技术与DevOps理念进行有机结合
的一次探索。
参考文献(References):
[1] G E R D ISR. D evO ps:协作是成功的保障[J].软件和
集成电路,2016(6) :16-17.
GERDIS R. DevOps :collaboration is guarantee of
success[J]. Softw are and Integrated C ircuit,2016(6):
16-17. (in Chinese)
[2]曾金龙,肖新华,刘清.Docker•开发实践[M].北京:
人民邮电出版社,2015:34.
[3]杨保华,戴王剑,曹亚仑.Docker•技术入门与实战
[M].北京:机械工业出版社,2014:7-8.
[4]华为D o ck er实践小组.D ock er进阶与实战[M].北
京:机械工业出版社,2016:220-222.
[5] 丁海斌,周霞.具有目的域武器系统等概率分割网格
化算法[J].指挥信息系统与技术,2017,8(2):66-70.
DING H aibin, Z H O U Xia. Equiprobable division net
w orking algorithm for weapon system w ith target area
[J]. Com m and Inform ation System and Technology,
2017,8(2) :66-70. (in Chinese)
作者简介:
丁海斌,男(1986—),工程师,研究方向为软件体系
结构与平台软件。
崔隽,男(1981—),高级工程师,研究方向为系统总
体与软件体系结构。
陆凯,男(1990—),工程师,研究方向为平台软件。
(本文编辑:李素华
)下载本文