使用容器将开发从本地迁移到远程
2022 年 4 月 4 日,作者:Olivia Guzzardo,@OliviaGuzzardo
行业专业人士喜欢问有抱负的开发人员的一个问题是:“普通开发人员每天写多少行代码?” 大多数人猜测数百或数千行——他们总是对实际平均数字只有几十行感到震惊。
那么开发人员其余的时间都花在哪里了呢?当然,有时间花在重要的任务上,比如代码设计和搜索“如何在 CSS 中使 div 居中”,但过多的时间花在了纯粹的开销上——设置项目、入职其他开发人员以及解决您在自己的机器上无法重现的问题。
Visual Studio Code 团队多年来一直以这一见解为核心进行研究:如果我们能够减少花费在开销上的时间,例如阅读环境设置,那么我们就可以增加生产力时间。我们的愿景是开发人员不必一次又一次地陷入同样的战斗。这意味着一致的开发设置,可以应对永无止境的版本升级、配置更改和硬件更新。
但是,实现这一目标的路径是什么样的?让我们考察一下旨在提高开发人员生产力的旅程,它将我们从本地开发带到了基于容器的开发,再到云端。
从本地开发开始
让我们从所有开发人员开始的地方(以及许多人仍在的地方)开始:本地开发。如果您曾经说过“但在我的电脑上可以运行!”,那么您很可能处于本地开发阶段。这意味着您的开发环境的一切都存在于您本地的机器上。

让我们描绘一下本地开发在现实世界中的样子。您是否曾经加入一个新项目,准备好开始工作并编写代码,但却被 handed 了一堆入职说明,以便让您的环境启动并运行。您花了几个小时等待安装命令完成,并被同事来回询问以解决构建失败的问题。可能需要几天时间才能成功运行项目。
然后,一旦您克服了入职的障碍,您的团队需要更新项目中某个依赖项的版本。然后,您必须在笔记本电脑上安装更新的版本,测试更新,并推出现有的重构更新。但是您的笔记本电脑运行的是 Windows,而您的队友运行的是 macOS,并且更改在他们的环境中无法运行,您还有更多的故障排除工作要做。
然后然后,您还需要确保所有更新在生产环境中也能正常工作……

显然,当一切都仅存在于开发人员的机器上时,这是存在问题的。您的机器可能与您的队友的机器差异很大,无论是从已安装的依赖项版本,还是从运行完全不同的操作系统。这可能导致永无止境的配置噩梦。即使您与同事同步了所有内容,当您部署代码时,您也会失去对不会遇到更多问题的信心。
难道不能确信您的开发环境与其他人(包括部署环境)相同,这难道不好吗?这给我们带来了我们提高开发人员生产力的第一项改进:基于容器的开发。
容器无处不在
“容器”在行业中已经是一个大热词一段时间了,所以让我们深入了解一下容器到底是什么。要理解容器的本质,可以将其与物理世界的集装箱进行比较。
简而言之,物理集装箱使货物保持为一个单元。所有需要运往 A 公司的一切都在集装箱 A 中。到达后,A 公司不必伸手去拿集装箱 B 和集装箱 C 来获取其完整包裹;所有物品都打包在集装箱 A 中。此外,公司不需要单独的基础设施来处理,例如,一个装满家具的集装箱与一个装满食品的集装箱。无论内容是什么,他们都有必要的工具来拾取该集装箱并将其运往目的地。这提供了一种高效、标准化的产品运输方式。
容器首次出现在虚拟世界中,正是为了获得相同的优势:一种简化的产品运输方式。它们提供了一种将您的软件作为一个单元进行运输的方式,包括所有二进制文件、依赖项和配置文件。这减少了在配置开销上花费的时间,因为容器打包了软件运行所需的一切。然后,容器可以轻松地从一个环境部署到另一个环境。预计到 2023 年,超过 75% 的全球组织将在生产中运行容器化应用程序,而 2020 年这一比例不到 30%。
传统上,容器用于代码准备部署到生产环境时。虽然这种模型确实简化了软件开发生命周期的末端,但对于开发人员在实际编写和测试代码时,它并没有多大帮助。为了弥补这一差距,基于容器的开发应运而生。
开发人员的容器
基于容器的开发理念是在开发过程的最初阶段引入容器。然后,开发人员可以在与其他环境(如生产环境)一致的环境中进行所有编码和测试。当环境之间存在一致性时,在不同环境之间排查不同代码行为所花费的时间就可以基本消除。
这使我们想到了开发容器的概念:一个运行全功能开发环境的容器。开发容器包含自己的应用程序及其依赖项,例如所需的工具、库和运行时。在下图所示,您可以看到这些依赖项存在于容器中,而不是在主机上,这意味着您可以无缝地在技术栈之间切换,几乎无需时间。

为了提供一种创建和连接开发容器的方式,VS Code 于 2019 年发布了Dev Containers 扩展。该扩展通过利用开发容器的全部功能来增强本地开发,同时永不离开 VS Code 的舒适区。随着该扩展超过 1100 万次安装,我们开始思考:如果您有一个托管在云中的开发容器怎么办?
迁移到云端
说实话:一切都在迁移到云端,那么为什么您的开发环境会与众不同呢?嗯,首先,云容易受到攻击。其次,似乎我们一直在听到关于重大停机的消息。第三,它可能很昂贵。第四……等等,云不是应该是个好事吗?
鉴于所有这些对云的担忧,想到像我们的开发环境这样重要的事情会被托管在那里,可能会让人感到不舒服。所以让我们保持舒适!让我们继续依赖我们那台 6 年的笔记本电脑,如果您尝试快速打开一封电子邮件,它就会发出非常奇怪的嗡嗡声,更不用说尝试构建项目了。然后,我们将舒适地等待不可避免的笔记本电脑崩溃,然后一旦我们拿到新笔记本电脑,我们就必须重建我们的开发环境,并尝试回忆起我们是如何配置它的。
事实证明,待在舒适区听起来并不那么美好。
虽然云存在固有的风险,但如果您明智地选择云托管服务,这些风险是可以减轻的——我们稍后将对此进行更多讨论。随着这些担忧的消除,您将能够获得云的一些主要优势:可伸缩性、更快的性能和更轻松的维护,仅举几例。
托管在云端可以让您访问另一个机器的资源,这些资源可以快速启动并随时随地可用。将其与基于容器的开发的好处相结合,开发人员可以瞬间上手进行编码。
云中的容器
在云中运行容器并不是一个新概念;事实上,一项研究表明,至少有一半的容器是在云中运行的。基本的基础设施涉及将容器部署到云托管的虚拟机。我们可以将我们的开发容器部署到云端,以提供云托管的开发环境。
VS Code 在这个领域的切入点是通过支持GitHub Codespaces。在几分钟内,您可以创建一个开发容器并进行配置,该容器托管在云中,并在您需要时可用。然后,您可以通过 VS Code(在浏览器或桌面版中)连接到一个完全为您管理的开发环境,不再依赖您的笔记本电脑的资源来处理需求。

Dev Containers 扩展中使用的与 GitHub Codespaces 中使用的开发容器相同,可以实现向云的无缝过渡。
但是请记住云的那些可怕的可能性?嗯,GitHub Codespaces 通过利用 GitHub 的云功能来缓解这些问题。Codespaces 在 GitHub.com 上托管的计算选项上运行,并且该功能目前可供使用GitHub Team 或 GitHub Enterprise Cloud 的开发人员使用。
GitHub 按用户收费,因此您永远不会支付超出您使用量的费用。您还可以设置支出限额,从而消除任何意外费用。此外,GitHub 可以提供 99.9% 的月度正常运行时间服务级别协议,并且GitHub Advanced Security 可用于缓解任何安全担忧。
凭借 VS Code、GitHub 和开发容器的力量,GitHub Codespaces 提供了一条清晰的路径,可以从本地开发迁移到云端。
下一步是什么?
作为开发人员,我们希望花更多时间开发软件,而不是花在令人头痛的配置上。行业趋势可以(也应该)用来赋能开发人员提高生产力。我们已经探讨了容器和云如何将我们提升到一个新的水平,您可以开始使用 Dev Containers 来亲自体验。那么,您认为什么可能是让我们的生活更轻松的下一步呢?
编码愉快!
Olivia Guzzardo,@OliviaGuzzardo