为什么容器很重要?
- 7 分钟
在本单元中,你将关注 Tailspin 团队,因为他们讨论了对其 DevOps 流程的一些急需的改进。 在此方案中,团队使用 Docker 来容器化其 Web 应用程序。 然后,团队会更新其 CI/CD 管道以支持它。
这几个星期过得很艰难
过去几周对 Tailspin 来说是一个充满挑战的时期。 由于多种原因,团队难以满足最后期限,并且公司对工作效率感到担忧。 Andy 已经召集了 Space Game 网站团队的一些关键利益相关者,共同收集针对即将向管理层展示的演示文稿的反馈。
安 迪: 感谢停下来。 我知道过去几周对每个人都很艰难,但我有一些好消息。 管理层明天将举办一场外部会议,听取关于改进绩效的建议。 他们邀请我就我们的 DevOps 成功情况提出案例研究,并说他们也对我们可能拥有的任何其他想法开放。 我希望我们可以利用这次会议作为集思广益的机会。 谁想先去?
每个人都看着阿米塔。 她最近特别沮丧。
Amita: 我会先去 如你所知,我针对多个团队进行测试,这很有挑战性,因为每个团队都使用自己的技术堆栈。 即使它们使用相同的基础平台(如 .NET 或 Java),它们也经常面向不同的版本。 我觉得有时我花费一天的一半时间,只是为了让测试环境达到能够运行我需要测试的代码的状态。 当某些内容不起作用时,很难判断代码中是否存在 bug,或者我是否意外配置了版本 4.2.3 而不是 4.3.2。
Andy 在白板上写下了“QA 的依赖项版本控制挑战”。
Tim:其中操作方面的问题也同样让人沮丧。 我们有几个团队具有独特的版本要求,因此我们必须在自己的虚拟机上发布其应用,以确保其版本和组件要求不会与其他应用冲突。 除了维护额外一组 VM 所涉及的开销外,所需要的相关成本比这些应用并行运行时的成本要高。
Andy 在白板上写了“使用虚拟机解决应用隔离所造成的开销”。
Mara:我想从开发角度说一说。 几周前,我正在开发对等更新系统,并且在我的电脑上运行良好,但当我将其移交进行部署时,它在生产环境中无法正常工作。 我忘记了我需要打开端口 315 作为服务的一部分。 我们花了一天时间进行故障排除,才意识到发生了什么。 一旦我们在生产环境中启用,系统就按预期运行。
Andy 在白板上写入“部署阶段之间的配置不一致”。
安 迪: 我认为这次谈话是一个很好的开端。 让我研究这些问题,看看我能想出什么。 以下是我听到的问题:
- 依赖项版本控制对 QA 的挑战
- 使用 VM 解决应用隔离导致的开销
- 部署阶段之间的配置不一致
将所有内容放在一起(在一个容器中)
第二天早上,安迪召开会议,向团队展示一个新想法。
安 迪: 我昨天与一些同事就我们面临的挑战进行了交谈,他们提出了一些有趣的建议。 我很期待尝试 Docker。 它是将整个应用程序打包为容器的技术。
Amita: 什么是容器? 这是否类似于 .zip 文件?
安 迪: 不完全是。 它更像是一个轻型虚拟机,旨在直接在主机作系统上运行。 生成项目时,输出是包含软件及其依赖项的容器。 但是,这不是一个完整的虚拟化系统,因此它可以在不到一秒钟内启动。
提姆: 它如何处理安全性和隔离?
安 迪: 安全和隔离由主机作系统处理。 当容器在主机进程中运行时,容器与同一主机计算机上的其他进程隔离。 这种隔离允许容器加载它所需的任何组件版本,而无论其他容器正在做什么。 这也意味着你可以轻松地在同一主机上同时运行多个容器。
Amita: 这听起来非常适合生产环境,但它是否解决了我们之前在管道中面临的挑战?
安 迪: 绝对! 整个容器将成为工件,而不是传送源代码或一组二进制文件。 这意味着,当 Mara 进行开发时,她的调试会话会在本地针对她的电脑上托管的容器运行。 Amita 测试时,她针对同一容器的副本进行测试,该副本已包含其依赖项的所有必需版本。 当 Tim 管理我们的生产环境时,他监视的容器是 Mara 开发并经 Amita 测试的相同容器的独立副本。
玛拉: 开发容器应用程序有多难? 我们是否必须对现有代码进行重大更改?
安 迪: 容器更属于打包和部署技术。 它们不会影响我们正在编写的基本软件。 我们只需命令工具在构建结束时生成一个 Docker 容器。 然后,在调试时,应用程序将运行于该本地容器,而不是我们的本地 Web 服务器。 事实上,Visual Studio 等工具甚至允许在 Docker 和 IIS Express 等调试环境之间进行切换,从而提供所需的灵活性。 我昨晚实际上复制了我们的网站项目,并将其构建为 Docker 容器来测试该过程。 我只需要添加一些基本容器配置;我不需要更改任何现有代码。
玛拉: 真高兴知道这个。 我敢打赌,我们甚至可以从你的分支(fork)更新 Azure Pipelines 的发布管道,以构建和部署 Docker 版本。
安 迪: 你读我的想法。
什么是 Docker?
Docker 是一种技术,用于自动打包和部署可移植的自给容器。 Docker 容器可以在找到 Docker 主机的任何位置运行,无论是在开发计算机、部门服务器、企业数据中心还是在云中。 Azure 提供了多种方式来运行基于容器的应用程序,包括应用服务或作为使用 Kubernetes 等业务流程技术管理的群集的一部分。
Tailspin 团队为此方案选择了 Docker 容器,因为它满足其所有需求:
QA 的依赖项版本控制挑战:应用程序打包为容器,以便为其带来正确版本的依赖项。
解决 VM 的应用隔离造成的开销:许多独立容器可以在同一主机上运行,其优势比虚拟机更高,包括更快的启动时间,以提高资源效率。
DevOps 阶段之间的配置不一致:容器附带了自动执行配置要求的清单,例如需要公开哪些端口。
采用 Docker 容器可能是微服务体系结构的关键步骤。 稍后我们将讨论有关此事的详细信息。