写点什么

迁移到 Docker:艰难的最后一半路程

  • 2016-07-14
  • 本文字数:2994 字

    阅读完需:约 10 分钟

作为一家提供对多云平台统一访问接口的公司,RightScale 帮助客户管理云计算提供商的 IT 流程。随着 Docker 的流行,该公司也开始关注这一概念。而且随着对 Docker 的了解,RightScale 公司发现了该容器的好处,并准备将软件开发和部署过程迁移到 Docker 中。Tim Miller 是 RightScale 公司的副总工程师,领导着公司的产品开发与部署工作。在 Tim Miller 的第一篇博客文章中,他讲述了RightScale 决定要迁移到Docker 的原因。之后,Tim Miller 又发表了Project Sherpa 项目和我们为什么迁移到Docker 的系列文章的第二篇第三篇第四篇,讲述了Sherpa 项目启动两周前后的进展。最近,RightScale 的高级软件工程师Ryan Williamson 和Tim Miller 联合编写了该系列文章的第五篇,讲述了Sherpa 项目后一半任务的进展情况。

在之前的几篇文章中,Tim Miller 一直试图以周为单位来记录Sherpa 项目的进展和相关情况。然而,项目启动后的第三、第四和第五周已经很难严格区分了——工程师们都在连夜赶工来完成迁移工作。

对于一项新的技术,工程师们总是会抱着极大的兴趣和热情,非常愿意在项目中进行尝试。因此,Sherpa 项目团队确立了将所有需要完成的迁移工作进行纵向划分的计划——每个小团队分别负责不同的服务。这也是他们所知道的保持团队成员高效工作的唯一方法。在计划确定一周后,每一个小团队都进行了热情高涨的状态——成员积极学习相关内容,喜欢正在做的事并积极对核心模板和部署方法的巨大改变进行宣传。这些行为经常与其他团队的想法是完全相反的。这使得Sherpa 项目的运维团队负责人Mark Dotson 非常不开心。他更喜欢T.G.I Friday 餐厅那种放松的感觉。因此,他的观点是:“想法非常好!在我们做完这个之后,可以讨论实现你的伟大想法。但是现在,还是让我先使用这个不是很好、但经过测试的方法”。

对于每一项服务,其迁移过程的第一个里程碑就是“传统部署”对象的Docker 化的1:1 替代版本部署到了集成环境中。在这之后,Mark 会接手,为模拟和生产环节做准备,并保证所有的服务都能够一起工作。为了让项目架构更加清晰,Sherpa 团队将服务依据Docker 化所需要的时间和服务是否会被逻辑部署在一起划分为了三个组。首先,他们确定了第一组应用各自进入模拟环节的目标日期。然后,再依次确定了第二组和第三组的时间。

随着每一组服务依次到达截止时间,这种划分一直没有问题。然而,他们很快便遇到了团队别阻塞的情况——构建集成环境的版本库各个分支变化太快,以至于合并后的版本没法和分支保持一致来支持Docker 版本。这就意味着,如果每个团队都不再将主分支合并到特征分支中,团队就没办法将代码提交到集成环境中。

例如,如果他们将主分支中的变化合并到了_tagservice_,每个工程师都需要更新_tagservice_。否则,由于依赖的应用无法工作,一些不相关的服务会突然崩溃。这就使得拥有一个稳定的配置更加困难,拉慢了所有人的速度。他们终于将所有工作进行到了模拟阶段,但在这个点遇到了难题。运维团队的负责人Mark 花费了15 个小时在他T 恤上加了一句话:“请将主分支合并到特征分支中…请记着一直这样做。”。

在最新的这篇文章发表时,他们已经进行到了项目的第五周。相比于之前的计划,项目进度有些落后。第一组服务进入生产环境的时间落后计划10 天;第二组服务进入生产环境的时间与计划时间刚好吻合;第三组服务只有3 个应用,预计还需要一周才能进入生产环境。引起时间延迟的主要原因就是集成环节——开发结束之后,容器需要移动到模拟环境,并且需要在移动到生产环境之前保证所有的回归测试通过。还有一部分延迟是服务的开发时间比预期长了一些。

目前的模拟环境包含了容器化的服务和传统部署的服务,而让两种服务一起工作是非常复杂也非常耗时的任务。由于之前的自动化工具并不能处理这种混合的情况,他们选派了一个运维工程师来保证这项任务的质量。因此,该任务就成为了一个瓶颈。但这名工程师也非常了解了如何让两类服务一起工作。尽管工作有所延期,之前采用的“置之死地而后生”的策略被证明为正确的决定。

重新定义工程师的每日工作任务

对于其开发团队而言,Sherpa 项目引起了工程师每天工作任务的两大变化:GitHub 的分支策略和本地开发应用的方式。之前,他们在GitHub 中设置了_master_、_staging_ 和_production_ 三个分支,来分别对应运行在各个系统中的代码。现在,他们重新定义了_staging_ 和_production_ 分支,将其对应为提交到驱动工作流的master 分支的指针。当代码提交到master 时,自动化工具会创建一个标记为“lastest”的镜像。该镜像会一直随着工作堆栈前进,直到进入生产环节。这使得该团队可以在追求持续交付方面走得更远。

Sherpa 项目的其中一个目标就是通过使用 Docker 来进行本地开发,增加开发和测试的速度和迭代效率。他们需要为开发人员提供两种机制来与微服务进行本地交互:

  1. 为开发人员提供一种机制来从应用的版本库中检出代码,并在容器中建立应用和所有的依赖关系。
  2. 为开发人员提供一种机制,利用现有的依赖关系的容器,来使用开发人员的本地源代码构建应用。

当开发人员正在编写与服务交互的代码,而他又并非该服务方面的专家时,第一种方法非常有用。配置和引导服务的速度越快,实际想做的事可以花费的时间也就越多。在这种用例中,他们使用了 docker-compose.yml 和标准的 Docker Compose 工具。一个简单的“docker-compose up”命令即可实现一个应用的自我安装、创建数据库并配置为与任何有依赖关系的微服务进行通信。

第二种用例是针对那些工作在其所擅长的应用的开发人员的。利用第二种方法,开发人员可以运行容器所需要的所有依赖关系,并对自己编写的代码在不必建立开发环境的情况下进行迅速迭代修改。RightScale 的架构师 Tony Spataro 编写的一个开源 RubyGem 在这方面提供了很大帮助。

到目前为止一切顺利

目前为止,迁移到 Docker 的行动已经取得了一些预期的成果,包括极大的提高了开发人员和 QA 团队的迭代速度。之前,当测试一个 bug 修复时,RightScale 的 QA 团队需要建立一个集成环境,并运行测试集才能重新生成之前的问题。然后,他们将代码放到一个单独的服务中来让系统运行到一个状态——系统正在运行包含修复的代码,之后重新运行测试集以验证之前的 bug 是否被修复,而且没有新的回归被引入。该工程通常需要 1-2 个小时。现在,RightScale 的 QA 团队可以在本地运行他们所需要的服务,将其作为基准进行测试,将包含修复的 Docker 镜像来下来,重新本地运行测试集,并可以在 20 分钟之内完成他们的任务。对一个 bug 修复而言,其速度提供了 3-6 倍。

此外,Tim Miller 等还发现移植后的服务可以节约服务器密度提高所带来的花销。未来,他会分享 Sherpa 项目的更多统计数据。至此,Sherpa 项目已经离终点很近了。接下来,他们只需要再加把劲,就可以完成整个迁移任务。

想了解更多 Tim Miller 团队如何使用 Docker 的内容,可以观看其在线研讨会。它包括了:

  • 安全产生高质量、易于管理的 Docker 镜像的建议
  • 在笔记本和云之间多宿主机互联的建议
  • 在产品中编排 Docker:服务发现、配置以及可审核性
  • Docker 带来的宿主机密度的增加
  • 用于 Docker 容器的动态监控和警告

感谢陈兴璐对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-07-14 16:533874
用户头像

发布了 268 篇内容, 共 122.2 次阅读, 收获喜欢 24 次。

关注

评论

发布
暂无评论
发现更多内容

Java虚拟机相关面试题,android系统开发面试

android 程序员 移动开发

【高并发】如何确保线程按照我们想要的顺序执行?

冰河

并发编程 多线程 高并发 异步编程 Java Concurrency

软件测试快速入门-软件测试行业现状-行业分析与职业规划

程序员阿沐

互联网 软件测试 自动化测试 计算机 测试工程师

Jetpack一统江湖!一个月彻底修改你的App架构!,Android技术图谱

android 程序员 移动开发

King-JVM中的线程行为,面试考点与面试技巧

android 程序员 移动开发

Java面试题八:抽象类和接口的区别,移动端开发技术创新

android 程序员 移动开发

Jetpack Compose初体验,flutter游戏开发

android 程序员 移动开发

Jetpack MVVM七宗罪 之三 :在 onViewCreated 中请求数据

android 程序员 移动开发

JetPack系列——Navigation(一),flutter安装androidsdk

android 程序员 移动开发

面试题系列:用了这么多年的 Java 泛型,我竟然只知道它的皮毛

Sakura

Java 架构 面试 计算机

面试题:软件测试的流程

程序员阿沐

互联网 软件测试 计算机 测试工程师 测试流程

软件测试需要具备的技能(软技能硬技能)

程序员阿沐

编程 程序员 软件测试 教程 测试工程师

万字解读鸿蒙轻内核物理内存模块

华为云开发者联盟

鸿蒙 内存 虚拟内存 物料内存 内存页

Java泛型,安卓面试项目经验

android 程序员 移动开发

Java虚拟机相关面试题(1),整理出Android逆向系列学习进阶视频

android 程序员 移动开发

IOC架构设计之控制反转和依赖注入(一),2021大厂Android面试经验

android 程序员 移动开发

Jetpack之DataBinding,2021Android最新大厂面试真题

android 程序员 移动开发

Jetpack架构组件库-LiveData实战与应用-总有适合你的方案

android 程序员 移动开发

IT-架构师绝对不能错过的-34-技术知识图谱帮你轻松拿下大厂offer

android 程序员 移动开发

Jetpack系列(三) — LiveData,大厂Android面试总结+详细解答

android 程序员 移动开发

Jetpack一统江湖!一个月彻底修改你的App架构!(1),kotlin协程源码分析

android 程序员 移动开发

JVM如何实现线程同步,干货精讲

android 程序员 移动开发

软件测试要遵循的原则有哪些?软件不存在缺陷是不可能的?为什么?

程序员阿沐

程序员 互联网 软件测试 测试工程师 测试原则

javascript中的原型与对象(一),12个View绘制流程高频面试题

android 程序员 移动开发

Kvrocks 2.0.4 发布

Kvrocks

c++ redis Redis 协议 storage

kotlin 实战之委托总结,成为一名合格Android架构师

android 程序员 移动开发

Jetpack之Paging,android面试自我介绍

android 程序员 移动开发

kotlin 协程最佳实践-android官网,软件开发面试题及答案

android 程序员 移动开发

IT圈的“年龄歧视”,移动互联网app开发实例

android 程序员 移动开发

Jetpack Compose漫谈,搞懂这些直接来阿里入职

android 程序员 移动开发

Jetpack_Data Binding入门指南,这些新技术你们都知道吗

android 程序员 移动开发

迁移到Docker:艰难的最后一半路程_语言 & 开发_Tim Miller_InfoQ精选文章