一尘不染

我应该使用 Vagrant 还是 Docker 来创建隔离环境

javascript

我使用 Ubuntu 进行开发和部署,并且需要创建一个隔离的环境。

为此,我正在考虑使用 Vagrant 或 Docker。有什么优点和缺点,或者这些解决方案如何比较?


阅读 146

收藏
2022-02-10

共2个答案

一尘不染

如果您的目的是隔离,我认为 Docker 就是您想要的。

Vagrant 是一个虚拟机管理器。它允许您编写虚拟机配置和配置脚本。但是,它仍然是一个依赖于VirtualBox(或其他)的虚拟机,开销很大。它要求您拥有一个可能很大的硬盘驱动器文件,需要大量内存,并且性能可能不是很好。

另一方面,Docker 通过LXC使用内核 cgroup 和命名空间。这意味着您使用与主机相同的内核和相同的文件系统。您可以将 Dockerfile 与docker build命令一起使用,以处理容器的供应和配置。您在docs.docker.com上有一个关于如何制作 Dockerfile 的示例;它非常直观。

你想要使用 Vagrant 的唯一原因是你需要在你的 Ubuntu 机器上进行 BSD、Windows 或其他非 Linux 开发。否则,请选择 Docker。

2022-02-10
一尘不染

免责声明:我写了 Vagrant!但是因为我写了 Vagrant,所以我大部分时间都生活在 DevOps 世界中,其中包括像 Docker 这样的软件。我与许多使用 Vagrant 的公司合作,许多公司使用 Docker,我看到了两者是如何相互作用的。

在我说太多之前,直接回答:在您的特定场景中(您自己工作,在 Linux 上工作,在生产中使用 Docker),您可以单独使用 Docker 并简化事情。在许多其他情况下(我将进一步讨论),这并不容易。

直接将 Vagrant 与 Docker 进行比较是不正确的。在某些情况下,它们确实重叠,而在绝大多数情况下,它们不会重叠。实际上,更恰当的比较是 Vagrant 与 Boot2Docker(可以运行 Docker 的最小操作系统)之类的东西。Vagrant 在抽象方面比 Docker 高出一个级别,因此在大多数情况下它不是一个公平的比较。

Vagrant 启动事物以运行应用程序/服务以用于开发目的。这可以在 VirtualBox、VMware 上。它可以像 AWS、OpenStack 一样远程。其中,如果你使用容器,Vagrant 并不在意,并且接受它:例如,它可以自动安装、下拉、构建和运行 Docker 容器。在 Vagrant 1.6 中,Vagrant 拥有基于 docker 的开发环境,并支持在 Linux、Mac 和 Windows 上使用与 Vagrant 相同的工作流程的 Docker。Vagrant 并没有尝试在这里取代 Docker,它包含 Docker 实践。

Docker 专门运行 Docker 容器。如果您直接与 Vagrant 进行比较:它特别是一个更具体(只能运行 Docker 容器)、不太灵活(需要 Linux 或 Linux 主机)的解决方案。当然,如果您谈论的是生产或 CI,则无法与 Vagrant 相提并论!Vagrant 并不存在于这些环境中,因此应该使用 Docker。

如果你的组织只为他们的所有项目运行 Docker 容器,并且只有开发人员在 Linux 上运行,那么好吧,Docker 绝对可以为你工作!

否则,我看不出尝试单独使用 Docker 有什么好处,因为你会失去很多 Vagrant 所提供的东西,这些东西具有真正的业务/生产力优势:

  • Vagrant 可以启动 VirtualBox、VMware、AWS、OpenStack 等机器。不管你需要什么,Vagrant 都可以启动它。如果您使用 Docker,Vagrant 可以在其中任何一个上安装 Docker,以便您可以将它们用于该目的。
  • Vagrant 是您所有项目的单一工作流程。或者换一种说法,不管项目是否在 Docker 容器中,人们必须学会运行一个项目只是一件事。例如,如果未来出现竞争对手直接与 Docker 竞争,Vagrant 也将能够运行它。
  • Vagrant 适用于 Windows(回到 XP)、Mac(回到 10.5)和 Linux(回到内核 2.6)。在所有三种情况下,工作流程都是相同的。如果您使用 Docker,Vagrant 可以启动可以在所有这三个系统上运行 Docker 的机器(VM 或远程)。
  • Vagrant 知道如何配置一些高级或重要的东西,比如网络和同步文件夹。例如:Vagrant 知道如何将静态 IP 附加到机器或转发端口,并且无论您使用什么系统(VirtualBox、VMware 等),配置都是相同的。对于同步文件夹,Vagrant 提供了多种机制来获取您的本地文件传输到远程机器(VirtualBox 共享文件夹、NFS、rsync、Samba [插件] 等)。如果您使用的是 Docker,即使是带有没有 Vagrant 的 VM 的 Docker,您也必须手动执行此操作,否则在这种情况下他们将不得不重新发明 Vagrant。
  • Vagrant 1.6 对基于 docker 的开发环境具有一流的支持。这不会在 Linux 上启动虚拟机,而是在 Mac 和 Windows 上自动启动虚拟机。最终结果是在所有平台上使用 Docker 是统一的,而 Vagrant 仍然处理诸如网络、同步文件夹等繁琐的细节。

为了解决我听到的支持使用 Docker 而不是 Vagrant 的具体反对论点:

  • “它是更少的活动部件” - 是的,如果您专门为每个项目使用 Docker,它可以是。即便如此,它还是牺牲了 Docker 锁定的灵活性。如果您决定不将 Docker 用于过去、现在或未来的任何项目,那么您将拥有更多可动部分。如果您使用过 Vagrant,那么您将拥有一个支持其余部分的活动部分。
  • “更快!” - 一旦你拥有可以运行 Linux 容器的主机,Docker 运行容器的速度肯定比任何虚拟机都快。但是启动虚拟机(或远程机器)是一次性成本。在一天中,大多数 Vagrant 用户从未真正销毁他们的 VM。这是对开发环境的一种奇怪的优化。在 Docker 真正大放异彩的生产环境中,我理解快速启动/关闭容器的必要性。

我希望现在可以清楚地看到将 Docker 与 Vagrant 进行比较是非常困难的,而且我认为这是不正确的。对于开发环境,Vagrant 更抽象、更通用。Docker(以及使它表现得像 Vagrant 的各种方法)是 Vagrant 的一个特定用例,忽略了 Vagrant 必须提供的所有其他内容。

总之:在高度特定的用例中,Docker 无疑是 Vagrant 的可能替代品。在大多数用例中,它不是。Vagrant 不会妨碍您使用 Docker;它实际上尽其所能使这种体验更加顺畅。如果你发现这不是真的,我很乐意接受改进的建议,因为 Vagrant 的目标是在任何系统上都能很好地工作。

希望这可以解决问题!

2022-02-10