Vagrant 与 Docker:哪个适合您? (可以两者兼而有之)

已发表: 2023-01-26

DevOps 团队面临越来越大的压力,需要快速为客户提供更强大的功能。 云提供商通过具有出色 CLI 和 API 集成的可扩展平台提供解决方案。 不幸的是,云提供商公开的接口可能不兼容。 但一些云原生工具可帮助 DevOps 团队为任何云提供商构建自定义解决方案。

两个这样的工具是 Vagrant 和 Docker。 了解它们的作用以及它们如何协同工作是充分利用您的云环境的关键。

Vagrant 是一种用于在单个工作流程中构建和管理虚拟机 (VM) 环境的工具。 无论您是构建本地 VM 以与管理程序一起运行,还是仅构建云 VM,Vagrant 都提供一致的配置格式、单一 CLI 和共享配置程序来安装软件和更改配置。

Docker 提供了将软件和支持配置打包到跨多个平台一致运行的图像中的能力。 Docker 使 DevOps 团队确信软件将以与在托管云平台上运行的方式大致相同的方式在本地工作站上运行。

尽管 Vagrant 和 Docker 的共同目标是创建可重复的环境,但它们以不同但互补的方式实现。 本文探讨了 Vagrant 和 Docker 如何实现他们的目标。

什么是码头工人?

Docker 是一个用于开发、运输和运行应用程序的开放平台。 它允许 DevOps 团队将自定义软件、支持应用程序和库以及配置、网络、文件安装、运行状况检查和启动脚本的说明打包到一个称为映像的独立工件中。

然后图像在称为容器的轻量级隔离环境中执行。 与通常保留固定数量的内存并严格限制 CPU 使用的 VM 不同,容器更具弹性并且只消耗它们需要的内存和 CPU。

这允许许多容器高效地并排运行,从而降低成本并增加规模。 然而,容器并不像 VM 那样安全,这意味着容器不是运行不受信任代码的理想解决方案。

屏幕截图:Docker 网站 — Vagrant 与 Docker。
码头工人

为什么使用 Docker(相对于 Vagrant)?

DevOps 团队通常使用 Docker 来交付和运行 Web 应用程序,包括与消息队列集成或托管在响应基于云的触发器和事件的功能即服务 (FaaS) 平台上的云原生应用程序。

像 Kubernetes 这样的平台建立在 Docker 之上,允许大规模地编排容器。 此外,每个云提供商都支持在其平台即服务 (PaaS) 产品中运行 Docker 容器的能力。 现在很少能找到不支持 Docker 的 PaaS。

Docker 还可以分发和执行基于 CLI 的工具,所有流行的云原生工具都提供嵌入其 CLI 的 Docker 映像。

码头工人? 流浪汉? 不确定哪个是构建自定义解决方案的正确工具? 在此处了解更多信息: 点击推文

Docker有什么好处?

Docker 解决了传统软件部署过程面临的一个常见问题,即自定义应用程序在开发人员的本地工作站和生产环境中运行时可能会呈现不同的结果。 这些差异通常是由于开发人员运行不同版本的编程语言、使用不同的配置来支持 Web 服务器等应用程序,或者运行与生产环境完全不同的操作系统。 这些差异导致支持问题在团队之间来回跳动,评论如“它在我的机器上工作”。

由于 Docker 映像包含自定义应用程序、所有支持应用程序和库的代码,因此映像在容器中执行,无论它们在何处运行,都能提供更一致的结果。

Docker 镜像很容易使用 Docker Hub 等注册表进行分发,允许 DevOps 团队快速共享镜像并使用各种托管平台部署镜像。 例如,您会发现 Kinsta 的 DevKinsta WordPress 开发套件背后有 Docker。

在需要更复杂的应用程序堆栈的地方,例如将数据库与后端应用程序一起部署,或一组相关的微服务,Docker Compose 提供了使用单个命令创建和链接多个 Docker 容器的能力。 所有容器、相关设置和网络配置都在单个 YAML 文件中定义。 Docker Compose 然后读取这个文件来创建和管理多个容器作为一个单元。

Docker 还享有主要云提供商近乎普遍的支持,这意味着 DevOps 团队在云中执行 Docker 映像时,选择太多了。

什么是 Vagrant?

几十年来,VM 已被证明是用于分区和配置计算资源的可靠且安全的解决方案。 虚拟机仍然是云提供商提供的最受欢迎的服务,许多团队的商业和开源解决方案都希望在本地运行虚拟机。

然而,这种多样性给 DevOps 团队带来了挑战。 每个解决方案都公开了不同的 CLI 和 API 来创建和管理 VM,因此很难保持本地开发环境和基于云的平台之间的一致性。

Vagrant 通过抽象 VM 平台之间的潜在差异提供了一个解决方案,允许 DevOps 团队使用单一 CLI 和一致的配置语法来配置新的 VM。 采用 Vagrant 的团队可以创建一致的 VM,无论它们是在本地还是在云环境中运行,并且可以轻松地在环境之间切换。 Vagrant 有多种不同的用途,包括作为 MAMP 的替代品(macOS、Apache、MySQL/MariaDB 和 PHP、Perl 或 Python)。

屏幕截图:Vagrant 网站 — Vagrant 与 Docker。
流浪汉

为什么使用 Vagrant(相对于 Docker)?

可以通过手动安装软件和编辑配置文件来启动 VM 和手动配置操作系统。 这并不理想,因为该过程不可重复,这意味着必须为不同的操作系统和提供商手动重新创建 VM。 这也使得以后几乎不可能了解虚拟机是如何配置的。

更好的做法是将配置虚拟机所需的过程自动化。 Vagrant 提供了一个单一的工具来自动化为许多供应商构建 VM 的过程。 Vagrant 还在 Vagrant Cloud 上提供了大量高质量的 VM,DevOps 团队可以使用这些 VM 来开始他们自己的 VM。

Vagrant 有什么好处?

使用 Vagrant 的 DevOps 团队有一个单一的工具来学习,无论他们是为本地平台、云平台还是两者构建 VM。 您可以轻松调整 Vagrant 配置文件并在以后重新运行或查看它们以了解 VM 的构建方式。

Vagrant 还允许 DevOps 团队迁移到云端或在提供商之间迁移,而无需重新设计他们用于构建 VM 的流程。

Vagrant 创建的虚拟机提供了高级别的隔离,通常利用现代 CPU 内置的专门虚拟化支持。 这使得 VM 和创建它们的工具(如 Vagrant)成为安全和隔离具有高优先级的最佳选择。

许多 Linux 发行版,例如 Ubuntu 和 Fedora,也提供了官方的 Vagrant 盒子,DevOps 团队可以在上面构建。 这减少了构建自定义 VM 所需的时间。

尽管 Docker 和 Vagrant 以不同的方式工作,但您知道可以同时使用它们来实现您的目标吗? 在此处了解更多信息: 点击推文

Vagrant 与 Docker:近距离观察

Vagrant 和 Docker 都通过自动化构建、分发和运行软件应用程序来提高 DevOps 团队的效率。

Docker 通过图像形式的自定义打包格式和通过容器的轻量级执行环境实现了这一目标。 容器在平台之间一致地执行,让 DevOps 团队更有信心他们的软件按预期工作。 Docker 得到 PaaS 和 FaaS 云平台的良好支持,允许 DevOps 团队选择最适合他们需求的平台。

许多容器可以在一台主机上共存,主要是——但不是完全——彼此隔离,同时共享相同的资源池。 这允许容器有效地扩展。

Vagrant 通过提供一种与现有提供者构建 VM 的一致方法来实现这一目标。 对于已经投资于 VM 并依赖其高级别隔离、安全、控制和自定义的团队来说,这是一个理想的选择。

Docker 还提供了运行可信代码时的最佳解决方案,同时最大限度地降低了计算成本。 容器彼此合理隔离,但开销很小。 这意味着许多容器可以在共享操作系统上同时运行。 当团队需要高级别的隔离和安全性或需要同时运行许多不同操作系统的能力时,VM 提供了最佳解决方案,而 Vagrant 为以自动化和可重复的方式构建 VM 提供了一个方便的解决方案。

Vagrant 和 Docker 不是相互排斥的技术,这两种工具可以同时使用。 例如,DevOps 团队可能使用 Docker 来开发和运行应用程序,同时使用 Vagrant 重新创建专门的环境来重现问题。 Docker 甚至可以在 Vagrant 创建的 VM 中运行,可能是为了测试 Docker 的新版本或测试在隔离环境中作为 Docker 映像分发的工具。

概括

DevOps 团队在构建、分发和运行应用程序时有很多选择。

Docker 提供自定义镜像格式和容器执行环境,允许大规模和高效的资源使用,并支持跨 PaaS 和 FaaS 平台。

VM 提供来自许多云和本地 VM 供应商的安全和隔离的执行环境,Vagrant 抽象出许多差异以提供单一 CLI 和一致的配置语法来跨供应商实例化 VM。

在开始开发下一个应用程序之前,请先了解一下 Kinsta 的应用程序托管服务如何利用 Dockerfiles 来管理代码的部署。