简介Docker在美团网站服务器上的应用方案

所属分类: 网站运营 / 建站经验 阅读数: 91
收藏 0 赞 0 分享

自动构建系统是从美团的自动部署系统发展出来的一个新功能。每当开发人员提交代码到仓库后,系统会自动根据开发人员定制的构建配置,启动新的Docker容器,在其中对源代码进行构建(build),包括编译(如Java、C++和Go)、预处理(如JavaScript和CSS)、压缩(如图片)等操作,生成最终需要上线的程序包。

背景和问题

美团的代码自动部署系统承载着美团所有业务的代码上线工作。代码部署系统一开始基于简单的Bash脚本,从一个中央主机上通过Rsync和SSH进行文件传输和命令执行。
2015125113920687.jpg (590×400)

图1  代码部署系统架构图

代码发布系统经过多番演进,增加了很多功能,但原来的中心式架构仍然保留了下来,见图1。发布者通过Web界面或者REST API控制中控机,中控机负责从Git服务拉取代码,构建应用程序包,然后通过Rsync上传程序包到应用集群,并用SSH执行远程命令。
2015125113939813.jpg (295×200)

自动部署系统为美团业务的快速发展提供了有力的支撑。由于我们采用了开发人员自助上线的方式,发布操作频繁,工作日每日上线达上千次。图2是过去15个月每个月的发布次数。为了持续优化发布速度,给发布人员提供良好的体验,我们把单次发布平均时间作为发布系统的一项重要的KPI。

然而,随着美团业务的迅速扩张,服务增多,发布应用数目也增多,中心化的架构的问题也凸显了出来。

问题1:资源竞争
多个构建任务同时进行,竞争中控机的资源,影响发布速度。有一次一个应用受到同时进行的某Java类应用发布的影响,通常两分钟的发布变成了十多分钟,严重影响发布体验。如果出现事故需要回滚,就是更严重的问题了。

问题2:环境冲突
不同应用的构建依赖环境在一台发布机上,需要考虑环境冲突和隔离的问题。例如,Java 1.6/1.7共存,应用需要通过JAVA_HOME变量指定使用的Java版本,Maven 2/3也存在同样的问题。npm的global包也需要兼容多个应用的构建。

问题3:安全隐患
应用的构建脚本运行在公共发布机上,脚本的Bug可能会影响到发布机的正常运行。例如某次一个构建脚本里面的sudo service nginx reload命令,本应是在应用服务器上执行的,但开发人员错误配置到了在发布机上执行的构建脚本里面。

解决方案

解决上述三个问题,我们首先想到的方案自然是重构为多台中控机的可横向扩展的方式。但由于某些应用的特殊性,改动比较麻烦,所以开始并没有走这个方向(现在已实现多中控机)。

那么另外一个思路:能不能把构建过程从中控机分离出来?这个思路受到了Travis CI(https://travis-ci.org)的启发。我们借鉴Travis CI,在代码提交时自动在一个新的环境中触发应用的构建。

因此,我们的解决方案可以概括为如下三点:

把构建过程放到Docker容器;
提交代码时自动触发构建;
发布时直接使用构建好的应用包。
使用前配置如下:

在发布系统配置发布项(build.yml);
在Stash配置自动构建服务的URL;
在私有Docker registry上传定制镜像(可选)。
使用过程比较简单,主要有如下几个步骤:

开发人员提交代码到Stash;
触发自动构建;
自动构建根据配置生成任务;
在Docker服务器上启动容器完成构建;
将构建好的包上传到美团云对象存储服务(MSS);
发布时从MSS拉取软件包并发布。
每次提交代码时会触发自动构建API。构建任务放进队列里,任务在Docker服务器执行。当发布时就不用再去编译,直接拉取软件包进行发布。从图6、图7两幅图中可以看到在发布过程中直接使用了已自动构建好的文件进行部署。
2015125114000045.jpg (210×200)

图3  自动构建的配置
2015125114016501.jpg (191×200)

图4  发布系统的配置界面
2015125114042754.jpg (300×164)

图5  自动构建架构图
2015125114059789.jpg (195×200)

图6  自动构建的日志
2015125114246228.jpg (241×200)

图7  嵌入了自动构建日志的发布日志
为什么没有用虚拟机?

美团的虚拟化比较彻底,自动构建也可以用虚拟机而非容器实现。但虚拟机都和业务相关,会长时间保留。其次,虚拟机和CMDB深度结合,创建后会上报基本信息,部署Agent,配置监控项等。此外,虚拟机的创建是比较慢的。综合考虑以上几点,我们使用了Docker而不是虚拟机作为自动构建的基本单元。

效果和收益

基于Docker容器的自动构建很好地解决了之前提到的三个问题:资源竞争、环境冲突和安全隐患。构建任务移出发布机,构建用Docker服务器可横向扩展,解决了资源竞争问题。每个构建都是独立的镜像,环境冲突问题不复存在。构建脚本运行在独立于发布机的Docker服务器上,对发布机造成的安全隐患自然就消除了。

除解决了以上三个问题外,自动构建还显著改善了发布速度。经统计,自动构建任务的平均执行时间是197s,而使用自动构建应用的平均发布时间是99s。如果不使用自动构建,那么这些应用的发布时间就是197s + 99s,大约是三百秒。可以看到,自动构建把应用的发布时间缩短了三分之二。

总结

自动构建是美团对Docker的首次应用。这个应用不是为了用Docker而用Docker的,而是在解决代码部署系统中的问题时,利用Docker很好地解决了我们遇到的问题。该应用只利用了Docker最核心的容器功能,并没有使用Docker集群管理、调度、自动扩容等高级的功能。自动构建的场景非常适合使用Docker。希望本文能够对计划开始使用Docker的公司有所启发。

更多精彩内容其他人还在看

打造成为优秀网站的10个技巧 推荐

每一个网站管理者都希望他们的网站是最好的。总有一个原因让他决定建立一个网站。但不管原因是什么,无论是出于商业目的还是为个人使用,创造一个令人印象深刻的网站始终是主要目标。
收藏 0 赞 0 分享

域名被别人备案了的注销方法

如果你发现自己的网站域名被别人备案了,可以按以下步骤撤销备案
收藏 0 赞 0 分享

降低网站被K的可能性 明晰网站优化的常见错误

搜索引擎优化很重要,也可以说是必不可少的东东,很多刚刚接触到SEO的朋友,在进行优化的操作上“不明白”或者“不清楚”,很容易出现操作错误,所以,就出现了被K的状况,有效的避免这些错误
收藏 0 赞 0 分享

国外windows主机要注意权限级别

最近要上一个.net的网站,而这个网站是采用xslt的,xslt中有使用到自定义脚本msxsl:script,但放到godaddy的服务器上去之后,却报出了黄页错误。
收藏 0 赞 0 分享

网站盈利不要在SEO的一棵树上吊死

无论你是做电子商务,写博客,操作一个企业网站或者是建个小站赚Google Adsense, 都可以找到相应的策略获得成功。当然成功是要通过大量实践得到的,不要只拘泥一种营销策略,只有多尝试才能知道哪几种对你的网站最有效。
收藏 0 赞 0 分享

注册资金难道创业者 互联网创业谈

创业者个个像愚公,当你决定去创业时,一推开门,面前就是一座座大山挡在了你前进的道路上,首当其冲的便是:注册资金。
收藏 0 赞 0 分享

购买虚拟主机10个注意事项

下面是我觉得在选购虚拟主机时候需要考虑的几点要素,希望对大家在选购虚拟主机的时候有一定的帮助。
收藏 0 赞 0 分享

搜索引擎流量下跌后的分析诊断过程

对于SEO来说,除了需要通过各种手段来实现网站的流量增长之外,我们也需要面对一个严峻的问题:流量下跌后,怎么办?这个时候,我们就需要分析流量下跌的原因,同时提出解决方案。这篇文章,我跟大家简单讨论下,如何做好搜索引擎流量下跌后的分析诊断过程。
收藏 0 赞 0 分享

新手认识 制作一个网站的成本分析

今天这个话题也是我很早就想谈的,谈谈自己从做个人网站到现在,在网站空间成本上的体会。看对大家有没有不一样的启发。
收藏 0 赞 0 分享

Groupon 美国团购网站的三方共赢的盈利模式

超低价,抢!以往这样的状况大多发生在商场的折扣专区,现在,这一场景在美国团购网站Groupon.com(下称Groupon)上得到再现,用户们疯抢网站每天推出的诸如餐饮、SPA、跳伞以及高尔夫这样的商品或服务机会。
收藏 0 赞 0 分享
查看更多