如何利用Docker构建基于DevOps的全自动CI

潘濬
• 阅读 7102

来自用户的DevOps实践分享,分享从开发代码到生产环境部署的一条龙操作的实践及经验, 包含工具技术的选型及考量、私有代码库与私有镜像库的应用等。

(一)容器服务的Rancher选型

1、为什么说是下一代核心技术

从互联网的多次变革说起,早期的C/S架构,到后来的B/S架构,一直到现在最普遍的M/S架构,他们的背后都是技术不断的优化改进,以适应、促进IT技术的发展整。体而言在过去10年间,互联网技术可以说是以手工制造的方式为主,类似于传统销售、设计、制作、然后打包销售。每个环节都需要大量的人员来操作,也需要不断有人接班学习来延续对应的环节。而未来10年将会是以流水线的方式为主 ,其主要原因是互联网云计算技术的高速发展及可持续快速交付的业务需求。其对应的DevOps方式将完美契合。开发运维一体化确切的说是一种方式,而这种方式需要全新的技术来支撑才行执行下去,我们将之称为下一代核心技术。

2、传统技术与下一代核心技术区别

传统的技术主要问题是高耦合,其耦合存在于服务器、硬件存储、内外网之间(网络通讯),存在于应用程序之间、代码之间、业务模块之间。虽然经过近几年的发展,在不断的去耦合化大趋势下,已经尽可能的将这几大块之间进行低耦合处理,但是由于传统技术的限制,无法从根本上解决这些问题。比如最常用的程序连接数据库。传统的方式多将数据库连接字符串写到程序的配置文件里,导致其连接数据库IP不能变,多节点部署程序需要一一手动修改数据库连接字符串,非常麻烦。随着技术的发展优化,有经验的研发人员会将数据库连接放到JNDI里面(如Tomcat),由中间件管理,这样将程序和数据库之间进行解耦。这也是传统技术架构常用的做法。但是对于多节点的部署变更,需要改变多个节点Tomcat的JNDI配置,还是存在易用性、可维护性、可靠性方面的问题。当然也有高级别的中间件来集中解决这些问题,如WebSphere的集群管理。但这都属于为了解决问题而解决问题,受限于传统技术,无法从根因上解决各个组件、软硬件之间的耦合问题。而且需要商业付费,非常的贵。

下一代核心技术,受益于云计算、微服务、容器服务的高速发展,采取DevOps的模式进行整合,实现硬件服务器、存储、网络、软件程序、代码之间的全低耦合甚至0耦合,这将大大提高交付能力,降低运维成本,实现互联网产品的快速迭代。

3、容器服务的Rancher选型

我之前的文章已经对微服务做了基本分析,本章节及后续章节会陆续对云计算的分析应用和容器服务的分析应用做逐一的讲解。微服务主要是对软件代码层面进行解耦,云计算主要从硬件支撑层进行解耦,而容器服务主要从应用层面进行解耦。容器服务的飞速发展,主要是Docker的巨大功劳,将传统的虚拟化技术带到一个全新的层面。Docker的优势在此不做多讲,主要是其原生的管理基于命令行,对于简单应用较为方便。但是在DevOps模式下就需要有一整套的规范接口来统一管理整个流水线。对于Docker容器的管理系统目前比较流行的有几个: K8S、Rancher、Shipyard等,其他还有一些不是很有名的在此不多做列举了,大家可以自行研究学习。

如何利用Docker构建基于DevOps的全自动CI

经过对比试用选型,在容器管理考虑到易用性包括跨主机通讯的管理、DevOps的支持力度等方面,Rancher以各方面优先胜出。Rancher目前在开源社区非常火爆,支持众多的编排引擎,当前最新版本为 1.6.12 ,大家可以下载试用。

(二)Rancher的应用及优点简介

1、环境选择

安装Rancher环境,一定要在干净的linux主机上进行,避免出现因配置导致的莫名其妙的问题。服务器操作系统建议CentOS7.4(内核3.10以上),低于这个版本的系统 如7.3 7.2会报一个小bug,不过倒不影响使用,再低内核的版本就不要用了,很多都不支持。

如何利用Docker构建基于DevOps的全自动CI

生产环境建议采用阿里云 Rancher(1C 2G以上的配置,若要保证运行稳定,建议配置至少2C 4G),宿主机(1C 2G以上的配置)、弹性公网EIP+ 专有网络测试,私有环境建议采用Rancher(1C 2G以上的配置),宿主机(1C 2G以上的配置)、 虚拟机(Hyper-V、VMware)+ 同一内网可通讯Rancher 1.6.12 ,调度引擎选择Cattle。Rancher2.0调度引擎默认使用K8s,当前还是测试版,官方不建议在生产环境使用。

2、环境配置

如何利用Docker构建基于DevOps的全自动CI

3、安装Docker

root执行

curl https://releases.rancher.com/install-docker/17.06.sh | sh

配置加速器

如何利用Docker构建基于DevOps的全自动CI

重启Docker服务

sudo systemctl daemon-reload
        sudo systemctl restart docker

4、安装Rancher管理端

登陆服务器Mgr01

如何利用Docker构建基于DevOps的全自动CI

运行完后,就可以通过IP:8888来访问Rancher的管理台了,接下来我们就可以点击 “添加主机” 来添加各个宿主机了

如何利用Docker构建基于DevOps的全自动CI

5、加入宿主机

如何利用Docker构建基于DevOps的全自动CI

依次登陆各个宿主机,执行5里面的脚本即可。

如果需要把mgr01加为宿主机,那么需要在4里面填写mgr01和ws之间互通的内网IP地址,建议不要添加mgr为宿主机,方便后续做mgr集群高可用。

6、添加好的界面

如何利用Docker构建基于DevOps的全自动CI

Rancher有很多好玩的、强大的功能,后续我们会逐一去发现讲解。对于DevOps来讲,原来可以这么简单。

(三)私有代码库阿里云Git使用

1、引言

使用DevOps肯定离不开和代码的集成。所以要想跑通整套流程,代码库的选型也是非常重要的。否则无法实现持续集成。目前比较常用的代码管理有SVN和Git,如果还使用SVN的,建议尽早迁移到Git上面,不然很费劲的。尤其是webhook,很多svn软件都不支持。

2、Git选型

可以采用公网的GitHub,这是用的最多的,但是免费账号还是缺少很多功能,收费版功能更全的,但需要考虑公司的预算。

免费版需要自行架设,Gitlab CE和Bitbucket都可以。当然这又少不了一部分维护人员、设备,从而导致增加成本。

那么既然不愿意花钱,又想要好用的,我们就只能选型国内一些公司的Git服务了。本着代码可靠性,服务器稳定性,功能扩展性综合对比,我们选择使用阿里云的Git库。

优点:速度快速度快,不限空间,不限项目数。可以和阿里的相关产品无缝集成。

3、注册使用

打开 链接 自行注册即可。使用方法就不说了,和GitHub一模一样。性能,稳定性,都比较好。最重要的是在国内,速度非常快

如何利用Docker构建基于DevOps的全自动CI

4、代码管理

通过开发IDE工具,把应用代码放到Git库里面。比如我这里有个config的项目

如何利用Docker构建基于DevOps的全自动CI

5、代码库管理

这时候看到Git服务端已经可以做代码管理了

如何利用Docker构建基于DevOps的全自动CI

(四)私有镜像库阿里云Docker服务使用

1、使用阿里云镜像库有很多优点

  • 稳定可靠,阿里技术,放心使用。
  • 国内cdn多节点加速,下载速度非常快
  • 可以和阿里云Git代码集成,不需要第三方CI工具
  • 国内专属加速器,一个人的专属通道,国外需要FQ下载的镜像,在这里统统可以搞定
  • 阿里云端构建,不需要占用本地资源,全球网络直达
  • 免费,不限空间

2、注册使用

打开 链接 即可,有阿里云账号可以直接登陆使用

如何利用Docker构建基于DevOps的全自动CI

3、配置加速器

登陆自己的Rancher服务器mgr和ws节点,依次执行下列配置,把自己的docker加速器配置上。

如何利用Docker构建基于DevOps的全自动CI

4、这时候你就有了自己的私有镜像库

可以使用docker标准的pull、push等进行镜像推拉操作。

(五)微服务CI与Rancher持续集成

1、引言

DevOps的核心魅力是快速的持续集成交付,降低研发和实施运维之间的交互,使得传统的各种扯皮现象统统消失。最重要的是降低成本保障产品交付可靠性。

使用Rancher作为持续集成的关键环节,统一结连微服务和云计算,使得产品从研发到上线流水线操作,提高生产效率,此处我写的是微服务而不是传统的程序,是因为微服务(架构的产品)和容器服务、云计算是完美结合的三大核心模块,也是互联网下一代核心技术DevOps的3个核心支柱。而传统程序,由于在微服务架构方面转型较慢或者生态链较弱,无法完美进行DevOps。

2、集成说明

本例集成代码采用java微服务项目,可抛弃第三方集成组件如Jenkins,简单高效。

实现提交代码,即生产发布的全自动流程 (Code->Git repository->Docker repository->Rancher->Server)

3、配置自动CI

登陆阿里云镜像库

选择镜像区域,如华南1.点击“创建镜像仓库”

如何利用Docker构建基于DevOps的全自动CI

创建:命名空间,
仓库名称:你的项目名称
源代码选择:阿里云Code或者其他的Git源
勾选:代码变更时自动构建镜像
路径:/或者你代码里Dockerfile文件的全路径
标签:latest或者自定义版本号
然后点击:创建镜像仓库

只要提交代码上来,服务器就会自动根据构建image镜像

如何利用Docker构建基于DevOps的全自动CI

4、配置镜像自动构建

点击刚创建的:server-config库,管理,记录下镜像库的地址,因为需要在接下来的Rancher中进行配置。

如何利用Docker构建基于DevOps的全自动CI

进入Rancher管理后台-基础架构-镜像库 -添加

添加成功后,Rancher就可以下载部署你的私有镜像

如何利用Docker构建基于DevOps的全自动CI

接下来进入Rancher管理后台 -API-WebHooks 添加一条接收器

名称:随意好记
类型:升级服务
参数格式:阿里云
标签:latest
选择器标签:update=server-config
然后点击:创建
复制保存:触发地址

如何利用Docker构建基于DevOps的全自动CI

再次进入阿里云Docker管理服务后台,可以看到构建里面的镜像已经构建完毕。

如何利用Docker构建基于DevOps的全自动CI

我们点击webhook,新增一条记录

名称:随意
URL:刚才Rancher里面配置的触发地址
标签:latest

如何利用Docker构建基于DevOps的全自动CI

登陆Rancher管理后台,开始部署我们的应用

新建服务

镜像:刚建立的镜像名称
标签:update=server-config
完成后,Rancher自动拉取镜像库的镜像并部署

如何利用Docker构建基于DevOps的全自动CI

5、自动集成,升级

提交代码。查看镜像自动构建过程。完成后,查看Rancher的服务server-config自动升级。

至此,基于DevOps的全自动CI/DI发布已经实现。且不用配置Jenkins等复杂的集成组件。最重要的是:不需要自己的服务器,全部FREE。

  1. 这种集成适合于团队内部进行了相关测试,最终交付的代码已经是稳定可靠版、直接上生产的情况。其实这也是大多数中小型公司使用的方式,属于半自动化,方便,灵活可控,可随时中断某个环节。
  2. 另外一种方式,是全部使用全自动化集成测试,同时包括自动化团队沟通、同时多镜像库发布、自定义动作等。这个对公司IT能力水平要求较高,使用Pipeline Jenkins流水线发布。这个我会在随后的博文里面给大家讲。

(六)Rancher集中存储及相关应用

1、前言

为什么要使用集中存储?使用集中存储有个很大的优势是数据安全和统一管理,和集群完美配合。产品集成存储经历

过几个阶段:

  • 单机本机存储。系统使用本地硬盘存储
  • 单网络集中存储。局域网主机使用同一网络内的磁盘阵列存储单元
  • 分布式集群本地存储。集群节点使用自己本地硬盘存储。
  • 分布式集群集中存储。集群节点使用集中存储(其背后可以是单一存储也可以是分布式存储,集中存储相当于一个代理入口)

其中云计算用的最多的是 3、4,主要适应于网络架构的分布式设计和基本云计算存储,如多机房、多地存储。使用集中存储给运维带来的最大优势就是核心数据保存,不怕应用崩溃,各种docker容器都可以随时抛弃、重建而不用担心数据问题。

2、Rancher中使用集中存储NFS

Rancher对Docker集群的管理已经是非常方便,默认是没有加载共享存储的,我们这里使用Rancher NFS插件来实现一个统一的存储,当然也可以选择其他的插件,目前官方只有这一个,其他非官方的如CephFS、FastDfs等请自行添加插件或自写插件来实现,在此不做过多解读。

点击Rancher应用商店,搜索nfs,找到官方插件并添加

如何利用Docker构建基于DevOps的全自动CI

填写主机地址:IP
目录:建议不要填 / 而是指向NFS服务器存储的一个目录
ON_Remove: Purge: 删除映射目录时会删除NFS远程对应的数据 Retain:不删除远程数据

点“启动”即可 ,Rancher会在各个宿主机上面添加NFS驱动

如何利用Docker构建基于DevOps的全自动CI

查看NFS驱动,每个宿主机都已启动完毕

如何利用Docker构建基于DevOps的全自动CI

使用NFS:
我们在添加服务的时候,可以配置下卷name:/容器对应目录
填logs:/opt/logs会对应远程NFS里面新建的logs目录
如果填/logs:/opt/logs则是常用的卷映射,会写入宿主机本地的/logs目录
驱动填写默认的rancher-nfs
这样,容器里面读写的文件就直接操作远程Nfs服务器了

如何利用Docker构建基于DevOps的全自动CI

查看效果:

启动应用后,容器的日志已经输出到NFS里面了。

如何利用Docker构建基于DevOps的全自动CI

用途及注意事项:
主要是针对日志类的,可以统一做日志搜集。

针对于数据持久化的,如MySQL数据可以通过映射mysql/data:/var/lib/mysql把数据集中存储到NFS上

注意:

  1. 集中存储要考虑到同时读写的问题,即Lock。有的程序无法同用一套数据,这时候要考虑到单独读写或放到多个变量子目录,如MySQL无法同时起2个实例读写一套数据。
  2. NFS插件还有不完善的地方,如只能映射目录,无法映射文件,我们常用的-v /nginx.conf:/nginx.conf就无法使用了。
  3. 多NFS服务器配置,无法从UI界面添加,只能从YML文件来处理。
  4. 集中存储一定要考虑速度问题,毕竟网络传输没有本地传输速度快,尽量选择公有云/私有云网络是走光纤通道的。尽量不要跨地域传输,如深圳的使用上海的NFS服务器
  5. 尽可能使用可靠性有保障的存储,毕竟服务器、容器这些可以丢弃,但数据是要绝对安全的。推荐阿里云的NFS服务,可以保障9个9的安全性。

作者简介

郑伟漪,深圳永达电子技术总监,负责公司互联网产品架构和研发管理。对于微服务架构开发有丰富经验,对互联网技术的发展有独到见解。曾服务神州数码(中国)、华为、银联商务等互联网产品。
本文版权归作者所有,转载请后台留言。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Kubernetes的四种用户部署场景,你知吗?
Kubernetes可以作为容器编排引擎、PaaS或者作为云原生应用的核心基础架构被用户部署到生产环境。这些用例并不是相互排斥的。DevOps可以委托基于Kubernetes的PaaS层完成整个应用生命周期的管理(ALM),也可以独立部署Kubernetes管理CI/CD工具部署的应用。对于新应用程序可以使用Kubernetes管理微服务架构的云原始应用,支
Stella981 Stella981
3年前
QCon技术干货:个推基于Docker和Kubernetes的微服务实践
2016年伊始,Docker无比兴盛,如今Kubernetes万人瞩目。在这个无比需要创新与速度的时代,由容器、微服务、DevOps构成的云原生席卷整个IT界。在近期举办的QCon全球软件开发大会上,个推应用平台基础架构高级研发工程师王志豪,基于他在基础架构方面多年的经验,分享了《个推基于Docker和Kubernetes的微服务实践》。!QCon技术
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
DOIS 2019 DevOps国际峰会北京站来袭~
DevOps国际峰会是国内唯一的国际性DevOps技术峰会,由OSCAR 联盟指导、DevOps时代社区与高效运维社区联合主办,共邀全球80余名顶级专家畅谈DevOps体系与方法、过程与实践、工具与技术。会议召开时间:2019070508:00至2019070618:00结束会议召开地点:北京主办单位:DevOps
Stella981 Stella981
3年前
Docker容器构建过程的安全性分析
来源:嘶吼专业版ID:Pro4houDevOps概念的流行跟近些年微服务架构的兴起有很大关系,DevOps是Dev(Development)和Ops(Operations)的结合,Dev负责开发,Ops负责部署上线,Docker出现之前,公司需要搭建一个数据库环境,有了Docker之后,只需在一些开源的基础镜像上构建出公司自己的镜像即可。因此目前
Stella981 Stella981
3年前
DevOps世界中的软件开发
!(https://oscimg.oschina.net/oscnet/f40e68cbfe8148deb00f040b4e917a0a.jpg)在整个软件开发过程中,开发人员通常需要花费大量时间来修复错误和漏洞,以便一切按计划进行交付。但是,通过DevOps实践,可以更轻松地管理和保护这些问题。这是由于以下事实:使用DevOps实践的软
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(