Docker在英雄联盟游戏中的实践探索(一)
![](http://dockerone.com/uploads/article/20150920/98de59cbc48c28070d41e1c43313b376.png)
容器技术已经风靡全球,我们欢迎容器化领域的新霸主们。
然而,他们也给Riot的流水线工程团队(Pipeline Engineering team)的同事们带来了新挑战。我叫Maxfield Stewart,是Riot的工程师,我们组主要负责构建流水线(Pipeline)——从代码签入(check in)到部署的一切工作,甚至更多。如果说持续交付是一首主题曲的话,那么我们就是用清唱的方式演唱它。我们运转的是一个类似云的环境,管理着Riot最大的一个服务器和虚拟机集群。其中的一个庞然大物是构建集群(Build Farm),由大量的物理机和虚拟机组成。它是从数年前的一个小集群发展而来的,当时只负责构建英雄联盟的游戏客户端。
最近,我们已经融入了Docker容器技术。我们是如何将容器与传统的构建集群集成,并使其越来越像一个自服务的基于云的工作引擎呢?我们能否使用Dockerfile定义构建环境,并与我们常用的开源架构相结合呢?我们又能不能抛弃传统的基于虚拟机的云,转身拥抱容器云呢?
![](http://dockerone.com/uploads/article/20150920/38baa4b8085d386ae975b427a51e5904.png)
上述问题已经持续了相当长的一段时间,就像寒冰射手(Ashe)的箭一样。接下来,我将通过一个系列博客介绍我们的团队是如何尝试回答上述问题的。本文是其中第一篇博客,主要是介绍我们的团队背景,以及我们为什么要整合容器技术。在后续博客中,我将具体地分享如何整合Jenkins和Docker。第一篇教程是一个 基础介绍 。如果你对于使用容器创建构建集群、持续交付、帮助工程师快速交付,那么这个系列就是你要的。请准备好:我将从基本介绍,逐步深入,最终介绍如何使用Docker承载真正的业务。
一年之前,我们将持续集成引入到了英雄联盟。在那之前,我们拼命地尝试以一个常规节奏来发布英雄联盟,但是我们步履维艰。因此我们打算尽可能自动化这一切,从构建流水线到创建测试环境,获得了大量的成果,包括提高交付一致性、减少构建时间、改善总体完成度。英雄联盟从一天几次的构建,增长到了每天30次构建。
![](http://dockerone.com/uploads/article/20150920/0fbd9c4f6c41dd7aafb27710b62ee4c0.png)
构建英雄联盟可不是开玩笑的,其中包括了超过150个任务,我们构建每个重要的版本。每次构建有各种形式,从传统的debug构建到新版本,以及专门为了包括腾讯和Garena在内的全球合作伙伴准备的变种版本。我们可以追踪到每次构建、什么测试环境、什么测试内容、PBE以及快速部署成产品。我们可以一键创建测试环境,并且可以在几个星期内从20个测试环境增加到70多个,包括450多个虚拟机。构建英雄联盟只是构建集群的一部分工作,构建集群本身支持了Riot各个工程团队的3300多个构建任务。然而,这一构建流程并不是完美的,这些陈旧的工具有时需要连接起来才能工作。在持续集成中,我们秉持4项原则:
- 我们认为工程师团队必须能完全掌控他们的技术栈,包括对于构建环境的管理员权限。
- 我们认为配置即代码。团队应当尽可能使用源码控制来维护他们自己的构建流水线和环境。
- 我们认为每当工程师执行一次构建,都需要针对所有可部署的配置构建一个可交付的版本。一个“构建”并不只是编译代码而已,而是所有可部署的组件的集合。
- 我们认为一次交付就是一个产品决策(shipping is a product decision)。只需按一下按钮,产品团队就能够部署并查看最新版本。
![](http://dockerone.com/uploads/article/20150920/9ec15f0c110a8cc40dfb0e6f8e65e936.gif)
我们需要世界一流的技术栈才能达到这些目标。通常有三种选择:完全重头编写、购买别人的工具或者定制化开源项目。
我们选择了第三种。在这篇博客中,我不想比较各种CI工具。不过,通过修改开源工具来符合我们的需求是一个最好的折中方案:不需要重头编写;可以与开源世界合作;如果有必要的话,可以轻易脱离它。
因此,我们的技术栈非常简单:
- 开源版本的Jenkins
- Jenkins的任务DSL插件(Job DSL Plugin)
- Jenkins的构建流插件(Build Flow plugin)
- 将各个组件连接在一起的工程独创性
我们选择和继续使用Jenkins,是因为它是灵活的、开源的、易于处理我们的基本构建操作。总体来说,Jenkins是易于创建一个构建流水线的,符合我们持续交付的核心需求(如上所述)。作为一款广泛应用的开源工具,我们有一个极具活力的社区在与我们合作。与重头编写自定义工具相比,工程师团队可以利用开源标准的实现,这是很有帮助的,也是具有风险的。开源标准经常变化,昨天的一个好主意明天就可能变成一个坏主意。然而,利用合适的插件和技术诀窍,我们只用了少量的代码、配置和开销,就完成了一个全自动的持续集成链。
那么,Docker发挥了什么作用呢?让我们回想一下我提到的持续交付的核心原则。最近,我们团队遇到的一个挑战是构建环境的所有权。之前,工程师们通过Packer.io定义自己的虚拟机镜像,然后给产品团队集群的root权限。本质上,我们需要通过Jenkins这一个工作流引擎定义一个内部的云环境。我们探索了几个通用的配置管理工具,如Puppet和Chef,来实现虚拟云环境,并使工程师们能控制这些机器。
然后,Docker出现了。
这件事情就变得简单了:Dockerfile比其他工具更易于维护。在Docker的帮助下,我们意识到容器更容易管理了。如果我们把Docker中Dockerfile的概念和构建环境的所有权结合起来,我们就进入了工程天堂。
Docker很善于解决部署中的挑战。我主要关注Docker是如何帮助工作流引擎、构建系统和流水线,同时也熟悉了如何将其作为一个部署工具和方法论。Riot管理着大量的微服务,而容器和微服务的组合就像花生酱和巧克力的组合。因为Docker成为了一个“Thing(tm)”,我们也会使用它来解决其他的一些问题。
流水线工程团队的梦想变得更真实了:我们想要一个流水线构建工具,它能动态地加速持续交付流水线,使用框架代码来按需地一键构建环境。为了创建一个完整的构建流水线,我们之前是通过自动化配置虚拟机来实现的,现在我们认为使用Docker容器来完成。
需要说明的是,Docker并不是一个完美的整体解决方案。它不能解决Windows和OSX的构建环境中的问题,也不能和我们使用的每个工具结合。但是,Docker确实解决了Linux平台中我们遇到的很多困难。在Riot,我们在平台和后端上进行了大量的工程工作。包括核心的后台服务在内,几乎所有的特性都是通过跑在Linux上的微服务来提供的。因此,如何优化解决方案空间是值得我们投入时间和精力的。
我们已经开始将Docker与现有的构建栈结合,并获得了一些早期的成就。我们创建了Jenkins的一键部署环境,在容器中部署,加速了测试和调试过程。我们从一个小型集群(大概500个任务)开始,使用容器作为构建环境,在所有权和迭代速度上团队也提供了积极的反馈,包括:
- 基于Linux构建微服务和网站的工程师们能够以编程的方式定义他们的构建环境了
- 本地的构建环境和构建集群中的构建环境是完全一致的(在后续博客中,我将介绍如何做到这一点)
- 动态资源分配意味着降低整体计算成本
- 一台虚拟机可以处理4个不同的组合300多个构建任务,这原本是通过8台虚拟机完成的
这篇博客仅仅是一个系列话题的介绍,这个系列将覆盖多个领域,以教程的形式发布,提供实例和源码。首先,系列博客将介绍如何使用Docker来部署Jenkins,包括各种最佳实践,并通过一个真实应用引入Docker的基础知识;然后,系列博客将探索容器化构建环境的各种方案,并介绍Riot是如何将Docker融入Jenkins的生态环境;最后,将介绍流水线工程团队是如何完成最终目标的。
本质上来说,这一系列博客就是记录了这个旅程。就像之前宣称的,我们知道我们想要的就是Docker容器定义的构建环境,开发团队可以通过Dockerfiles来维护它。在已知技术栈的情况下,我们希望能预生成构建流水线,这样一来,团队从创建代码库的第一天就能维护持续集成的构建流水线。对于如何实现我们有些想法,但过程是不断迭代的,而且有很多新的发现,博客的写法将会遵循这个过程。
我们希望通过系列博客来能分享我们的发现以及遭遇的挫折。这些或许不是什么大秘密,但可能是不容易发现的。我希望我们的系列博客能回报社区,并通过交流和对话学习到更多。
原文链接:THINKING INSIDE THE CONTAINER(翻译:夏彬 校对:魏小红)
Docker在英雄联盟游戏中的实践探索(一)相关推荐
- Docker在英雄联盟游戏中的实践探索(二)
本文讲的是Docker在英雄联盟游戏中的实践探索(二),[编者的话]这篇博客是Riot的Docker实践系列博客的第二篇,主要内容是:基于Cloudbees镜像创建新的Dockerfile,设置了一个 ...
- Docker在英雄联盟游戏中的实践探索(五)
本文讲的是Docker在英雄联盟游戏中的实践探索(五),[编者的话] 这篇博客是Riot的Docker实践系列博客的第五篇,主要讨论了如何从头创建你的Docker镜像. 在以前的帖子中,我们讲解了如何 ...
- Docker在英雄联盟游戏中的实践探索(四)
本文讲的是Docker在英雄联盟游戏中的实践探索(四),[编者的话]这篇博客是Riot的Docker实践系列博客的第四篇,主要讨论了如何添加一个基于Nginx的代理容器,以及如何用Compose来管理 ...
- Python爬取熊猫TV 英雄联盟游戏分类下面所有主播的人气排行
编写这个原生爬虫项目的3个主要目的: 1.巩固 python 基础知识 2.了解合理的编码规范和方式 3.了解爬虫基本原理 项目分析: 1.爬取网站: 熊猫TV(https://www.panda.t ...
- 基于NodeJS英雄联盟游戏游戏综合网站
21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确.快速. ...
- lol登录服务器未响应w7,Win7下无法登入LOL英雄联盟游戏的原因及解决方案
在win7系统中玩一些游戏的时候,经常会碰到各种各样的问题导致无法玩游戏,最近有使用win7纯净版系统用户反映说在玩lol英雄联盟登录服务器的时候,无法登入游戏,或者登录客户端之后不能玩的问题,而这种 ...
- hd6630m可以玩lol吗_LOL为什么样我的PING值不高?电脑是联想E520 显卡是ATI Radeon HD6630M 玩英雄联盟游戏的时候会卡...
在上一篇文章中,小编为您详细介绍了关于<整机购买的戴尔台式机可以单独更换显卡么?联想电脑M8500T(台式机)如何加装固态硬盘>相关知识.本篇中小编将再为您讲解标题LOL为什么样我的PIN ...
- mysql英雄联盟卡_hd6630m可以玩lol吗_LOL为什么样我的PING值不高?电脑是联想E520 显卡是ATI Radeon HD6630M 玩英雄联盟游戏的时候会卡......
在上一篇文章中,小编为您详细介绍了关于<整机购买的戴尔台式机可以单独更换显卡么?联想电脑M8500T(台式机)如何加装固态硬盘>相关知识.本篇中小编将再为您讲解标题LOL为什么样我的PIN ...
- 模拟英雄联盟游戏盒子的英雄排行榜的实现
模拟英雄联盟游戏盒子的英雄排行榜的实现 代码实现: //数据采集线程,获取英雄(英雄角色)出场数据,并插入到redis数据库中static class HeroScoreGenerate implem ...
最新文章
- 7张图了解2018物联网产业发展新趋势
- netty-客户端.group()方法 源码分析.md
- 实现 VC 最小化到 托盘
- [W3C][CSS]选择器(Selectors Level 3)[未完成]
- java制作头像框_头像框?搬空商店?活动还有二期?春活相关问题答疑
- CStdioFile写文件中出现的问题
- java多线程的基本实现方式与示例
- .NET下 Access与SQL Server的效率简易比较
- 赞一个 kindle电子书有最新的计算机图书可买了【Docker技术入门与实战】
- centos7搭建smb服务
- matlab 3.BPF封装 巴特沃斯带通滤波器
- OpenCV画椭圆、实心圆、凹多边形、线段、矩形
- HNUCM 道具的魅力值(贪心算法)
- matlab bsxfun memory,[转]matlab函数 bsxfunarrayfun
- 苹果iPhone5 16G长沙九方现货售8199元
- QQ拼音输入法的人机交互
- 交叉编译工具的使用说明
- hexo下next主题实现鼠标移动特效
- wireshark专栏——仅保存过滤出的报文
- java 数组 去掉第一个_java中数组的理解以及如何去掉断点
热门文章
- 中国创新公司TOP10:小米第一腾讯百度上榜
- Java模拟自行车电动车属性调用
- “苹果吃饱”的平板市场,新老玩家的翻盘之争
- 金昌法律事务所的辩护律师朴仁东:关于韩国加密货币的监管状况
- 全球三大设计奖之一“IDEA奖”公布,富士无反数码相机X100V获铜奖
- 如何在软文写作时巧妙植入关健词
- 【学习笔记】网页出现白屏可能的原因与优化方法
- 会计凭证增强抬头文本维护失败
- 外汇天眼:HAITONG FUTURES海通期货被山寨!受害者:到底哪个是真的?
- 金志文机器人歌叫什么_乐视《蒙面唱将猜猜猜》机器人九号是好声音金志文?...