基于Docker的持续集成方案(介绍) - Part.1

基于Docker的持续集成方案(介绍) - Part.1

2018-6-3 作者: 张子阳 分类: 分布式系统

使用docker有很多的便利,这个就不再讲述了,在文章 《基于Docker的持续集成方案(安装docker) - Part.2》 已经对docker有所介绍。这篇文章将介绍如何将docker结合到持续集成(持续部署)中。

鸟瞰图

三个重要的概念

这三个概念可以和源码管理做类比。

  • 镜像仓库:github是最大的源码库,hub.docker.com则是最大的镜像仓库(官方)。github上面包含了很多公司和个人项目的源码,hub.docker.com上则包含了很多公司和个人的docker镜像。docker镜像仓库就相当于github源码仓库。它除了可以搭建在互联网上,也可以搭建在局域网上。
  • Docker镜像:github上有成千上万的源码库,但在我们本地,通常只通过git clone命令来获取几个源码库到本地进行开发。一个镜像就相当于一个项目的源码库,是一个静态的概念。只不过源码库中包含的只是源码,而镜像则既包含源码也包含源码的运行环境(各种依赖)。
  • Docker容器:源码编译成可执行程序后,可以同时运行在多个进程中。比如用asp.net core开发一个站点后,可以同时启动多个站点(使用不同端口号),运行在不同的进程当中。Docker容器就是一个运行中的镜像。如果说:源码-->可执行程序-->进程;那么对于docker来说,则是:镜像-->容器。

下面是整体的一个结构:

基于docker的CI鸟瞰图

上图中每个步骤的流程如下:

  1. 本机开发环境,不需要安装docker,只需要根据选用的语言,安装顺手的开发工具就好了,例如Visual Studio等。开发者代码提交到位于本地局域网中的Git源码管理库,例如GitLab、Gogs等。此处我选择的源码管理库是Gogs。
  2. 使用源码库提供的Web钩子(Web hooks),将源码管理库和持续集成工具关联起来。当源码库更新时,发送通知给持续集成工具。
  3. 持续集成工具通过Web钩子获取到源码库更新的通知,然后从源码库拉取代码到本地。项目源码的根目录中应当包含两个文件,一个Dockerfile,一个docker-compose。其中Dockerfile用于制作镜像,docker-compose用于运行容器。
  4. 拉取到最新的源码后,代码持续集成工具负责生成本地镜像、运行容器(图中步骤3、步骤4)。
  5. 当开发者提交的是一个Tag标签时(此处可以自行定义规则,例如当Tag的前缀为release时),则持续集成工具则将本地镜像推送到远程的镜像仓库(Registry)。
  6. 当远程的镜像仓库获得更新后,将从镜像仓库中拉取镜像到本地镜像,然后运行容器,更新正式环境。

上图的步骤6、步骤7,也应当是需要采用第三方工具或者自行开发工具来实现的,但是我暂时还没有实现这一步骤。

需要部署和开发的部分

从上面的步骤中,可以看到,有若干需要部署的第三方工具。其中包括:

  • 代码库:通常有GitLab、Gogs等,这里我开始选择的是GitLab,但是试用之后,以及参考其他人的使用评价,感觉都是笨重、卡顿,比方说在我2GB内存的Linux上运行GitLab时明显感觉很不流畅。因此我选用了一个go语言开发的,Gogs源码管理库,也是基于Git的。github地址是:github.com/gogs/gogs。如何配置Gogs,参考《安装和配置Gogs源码仓库》
  • 持续集成工具:业界的工具也很多,有Jenkins、CircleCI等。这里我了解得不算太深入,但就了解到的情况来看,都存在下面这几个问题的某几项:配置复杂、入门学习曲线陡峭;收费;文档不健全;不是基于docker。本来我选择的也是go语言开发的Drone,但是它的文档比较简单,版本还没有到1.0,遇到两个问题,全网都找不到解决方案,最后放弃了。现在打算自己来写一个工具实现这部分,比起成熟的工具肯定不够灵活,但是满足我们的特定需求应当是足够了。
  • 远程镜像仓库:这个可以使用Docker官方提供的Registry镜像来制作,但需要配置访问权限等。可以参考《安装和配置Docker镜像仓库》

持续集成工具的功能

根据上面的分析,这个持续集成工具(我给它起名叫GOCI,因为打算用go语言来开发)需要实现的功能有下面这些:

  1. 接受源码库的提醒
  2. 判断是不是Commit提交
  3. 执行git pull,拉取源码
  4. 判断源码根目录是否有docker-compose文件
  5. 执行docker-compose,制作镜像(需要Dockerfile)、运行容器
  6. 根据规则和需要,执行docker push,将生成的镜像推送至远程镜像仓库

以上还在开发的过程当中 ...

感谢阅读,希望这篇文章能给你带来帮助!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jerry的SAP技术分享

在Kubernetes上运行SAP UI5应用(下)

上一篇文章 在Kubernetes上运行SAP UI5应用(上),我介绍了如何在Docker里运行一个简单的SAP UI5应用,并且已经成功地将一个包含了这个U...

9410
来自专栏编程坑太多

『中级篇』 Docker Bridge详解(26)

19640
来自专栏WeTest质量开放平台团队的专栏

一次触摸,Android 到底干了啥

通过 Android 系统输入子系统的分析来回答你。

25110
来自专栏大魏分享(微信公众号:david-share)

厉害了word哥 | 从两张图看红帽最高深的武功 |OpenShift

世上的高手 世上高手大约有两种: 第一种如下图这为老先生,一辈子纵横江湖数十载,所学武功实用有效,招数简明而力道雄厚,善于“简单粗暴”迅速解决问题。在老爷子的心...

52770
来自专栏友弟技术工作室

docker微服务初体验配置文件composedocker compose使用

1.1K50
来自专栏友弟技术工作室

docker微服务初体验

在介绍微服务时,首先得先理解什么是微服务,顾名思义,微服务得从两个方面去理解,什么是"微"、什么是"服务", 微 狭义来讲就是体积小、单个服务的设计。 而所谓服...

60780
来自专栏CSDN技术头条

Docker数据容器保护方式利弊

Docker是一个非常成功的Linux开源项目。它在Linux操作系统下无需增加管理器即可虚拟化应用程序。该应用程序常被抽象地误认为是操作系统(具有Linux内...

27670
来自专栏从零学习云计算

kubernetes学习记录(1)——kubernetes初理解

入门时,学习阅读的为《你闺女也能看懂的插画版Kubernetes指南》。由Deis的平台架构师Matt Butcher向他女儿介绍什么是Kubernetes,内...

55600
来自专栏coding

docker初体验

19110
来自专栏一个会写诗的程序员的博客

十分钟带你理解Kubernetes核心概念

本文将会简单介绍Kubernetes的核心概念。因为这些定义可以在Kubernetes的文档中找到,所以文章也会避免用大段的枯燥的文字介绍。相反,我们会使用一些...

13530

扫码关注云+社区

领取腾讯云代金券