持续集成的容器化策略

何为容器

近两年,随着容器(以 Docker 为首)的兴起,解决了诸多传统交付过程中的问题,像一次构建,随处运行以及开发即生产这些传为佳话。

在传统的交付过程中,开发人员和测试人员在开发测试的时候,所有的功能都正确无误,但部署到生产环境后,莫名其妙的问题就来了,这是因为开发、测试和生产环境都存在差异性,系统环境引发的问题。除此之外,生产环境通常会存在多个,而每部署一个新的环境意味着需要解决系统环境的差异性引发的问题,造成了无畏的浪费。

Docker容器的诞生,使得开发测试时的环境可以直接部署到生产环境上,有效地屏蔽了环境的差异性,解决了这个问题。它将软件运行所需的所有环境(系统参数、基础工具和第三方服务等)都封装在一个容器内部,任何需要部署的地方,只需要将容器运行起来。容器可以很方便地运行在Linux内核上。

用两张图来概括容器诞生前后的部署方式:

图中可见,部署一个Application通常需要诸多环境,所以每次部署的不同的Server的时候都需要执行安装脚本,一方面安装需要消耗网络资源和大量时间,另一方面,因为不同Server的环境问题,可能某些步骤不会那么顺利。都增加了部署成本。

使用容器后,部署方式就变了:

我们会将所有的依赖和服务打包安装好,只需要将打包好的Image部署到相应的Server,而对Server的要求就是安装好 Docker 命令行工具,然后使用docker运行容器即可。

实践指导:
实际部署中,我们通常按照单个服务的粒度进行划分容器,并不会将类似Postgres ServerApplication这样的两个服务放在一个容器中,而是将它们放在不同的容器中,并通过容器互联的方式进行交互。

所以,一句话概括容器所做的事情:提供轻量且安全、独立且隔离的运行环境


容器化部署

如此便捷,为何不在CI上使用容器化方案呢?我们之前的一个Python项目就使用了这种方案,CI服务的启动、测试运行、打包、部署,都是基于Docker容器完成的。我们的CI Pipeline如下图:

Pipeline中有五个步骤:

1. Portal,CI的入口,pull代码,编译,构建镜像(容器的载体)。
2. 单元测试,使用 $ docker run ...在容器中运行单元测试。
3. 集成测试,使用 $ docker run ...在容器中运行集成测试。
4. E2E测试,使用 $ docker run ...在容器中运行E2E测试。
6. 部署,测试通过后,将Portal中编译好的镜像部署到目标环境中。

细心的读者可能已经发现了一个问题,这没有打包过程,因为Python语言术语解释型语言,通常直接源码部署。但另外一个问题来了,如果部署的步骤直接部署了Portal中的镜像,是不是会将测试代码都打包了?

漂亮,这绝对是个好问题,以下列出了一些解决方案:

1. 构建镜像的时候不将测试代码添加进去,而在测试步骤,运行容器时将测试目录挂载到容器中。
2. 部署的时候重新使用Portal的代码库构建一个不包含测试代码的镜像进行部署。
3. 将代码库中部署到目标环境,在目标环境中构建镜像并运行容器。

每种方案,各有千秋,我个人推荐的是第二种,理由此处不详叙。


容器的管理

一个Web项目,通常会有应用、数据库、缓存等服务,而容器化方案推崇一个容器运行一个服务,通过容器互联的方式,将它们联结在一起构成一个可用的系统。所以,在部署的时候,我们通常会部署多个镜像,简单的比如单应用:主应用*1 + 数据库*1,复杂的比如微服务模式: 负载均衡*1 + 主应用模块*n + 数据库*n + 缓存*n + ...,如何去管理这些容器的生命周期,这就是目前微服务系统架构师所面临的挑战,再者,包括如何定义和拆分服务、如何实现服务发现、如何保证安全性、如何实现服务高可靠性(99%)、如何实现热部署等。

Docker 官方提供了容器编排的命令行工具 Docker compose 和集群管理工具 swarm ,我们用它可以管理多个容器的互联,另外, Docker rancher 提供了一个高效的可视化的管理方案。Docker Hub 也提供了容器部署和管理一体化方案,它还可以跟AWS进行集成。


面临的挑战

容器化带来便利的同时也带来了诸多挑战。如何定义服务?如何区分服务边界?如何实现服务发现?如何做到服务高可靠?如何管理大量运行的容器?如何管理容器的分发?等等。幸运的是,这些挑战给行业注入了巨大的能量,始终存在一批技术先驱和实践王者走在前面,去攻克一个个问题,从而造就行业的革命。


相关阅读

Docker三年回顾:梦想依在,人生正当年
Docker会是改变世界的那只“箱子”吗?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容

  • 一、Docker容器概述 1、docker中的容器技术演进 lxc --> libcontainer --> ru...
    任总阅读 3,923评论 0 26
  • 1.Docker简介 1.1 什么是虚拟化 在计算机中,虚拟化(英语:Virtualization)是一种资源管理...
    EdwinGates阅读 1,758评论 0 0
  • 怎样赚钱? 是不是每个人考虑的问题。 今天的分享有干货的啊! 常常感觉到创业很难,创业成功的概率仅4%,很多人说自...
    郭定富阅读 182评论 0 2
  • 喜欢余华,初读作品之时,心里满满的敬意,何为活着,活着为何?樵歌萧吟,煮雪问茶,晴耕雨读,踏雪访梅,采菊东篱...
    潇潇1314阅读 335评论 0 0
  • 标准腿型是什么? 拥有双美腿足够让你在这个夏天成为焦点。而女生们对自己的腿型的追求是永无止境的。那怎样的腿型是标准...
    KTF001阅读 399评论 0 1