我使用 Ubuntu 进行开发和部署,并且需要创建一个隔离的环境。
我正在考虑为此目的使用 Vagrant 或 Docker。有哪些优点和缺点,或者这些解决方案如何比较?
免责声明:我写了 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 相同的工作流程。 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 的目标是与任何系统同等运作。
希望这可以解决问题!
我是 Docker 的作者。
简短的回答是,如果你想管理机器,你应该使用 Vagrant。如果您想构建和运行应用程序环境,则应使用 Docker。
Vagrant 是一种管理虚拟机的工具。 Docker 是一种通过将应用程序打包到轻量级容器中来构建和部署应用程序的工具。容器可以容纳几乎任何软件组件及其依赖项(可执行文件,库,配置文件等),并在保证且可重复的运行时环境中执行它。这使得构建应用程序并在任何地方进行部署非常容易 - 在笔记本电脑上进行测试,然后在不同的服务器上进行实时部署等。
这是一个常见的误解,你只能在 Linux 上使用 Docker。那是不对的; 您也可以在 Mac 上安装 Docker,Windows 支持正在进行中。当安装在 Mac 上时,Docker 捆绑了一个小型 Linux VM(磁盘上 25 MB!),它充当容器的包装器。一旦安装,这是完全透明的; 您可以以完全相同的方式使用 Docker 命令行。这为您提供了两全其美的优势:您可以使用容器测试和开发您的应用程序,容器非常轻便,易于测试且易于移动(例如, 请参阅https://hub.docker.com以共享可重复使用的容器 Docker 社区),您无需担心管理虚拟机的细节,这无论如何都只是达到目的的手段。
从理论上讲,可以使用 Vagrant 作为 Docker 的抽象层。我建议不要这样做有两个原因:
首先,Vagrant 不是 Docker 的好抽象。 Vagrant 旨在管理虚拟机。 Docker 旨在管理应用程序运行时。这意味着 Docker 可以通过设计以更丰富的方式与应用程序进行交互,并提供有关应用程序运行时的更多信息。 Docker 中的原语是进程,日志流,环境变量和组件之间的网络链接。 Vagrant 中的原语是机器,块设备和 ssh 密钥。 Vagrant 只是坐在堆栈的较低位置,它与容器交互的唯一方法就是假装它只是另一种机器,你可以 “启动” 和 “登录”。所以,当然,您可以使用 Docker 插件键入 “vagrant up”,并且会发生一些相当不错的事情。它是 Docker 可以做的全部广度的替代品吗?尝试本机 Docker 几天,亲眼看看:)
第二,锁定论证。 “如果你使用 Vagrant 作为抽象,你将不会被锁定在 Docker 中!”。从设计用于管理机器的 Vagrant 的角度来看,这非常有意义:容器不仅仅是另一种机器吗?就像 Amazon EC2 和 VMware 一样,我们必须小心不要将我们的配置工具与任何特定供应商联系起来!这将创建锁定 - 更好地用 Vagrant 将它全部抽象出来。除此之外,完全错过了 Docker 的观点。 Docker 不提供机器; 它将您的应用程序包装在轻量级的可移植运行时中,可以在任何地方删除
您为应用程序选择的运行时与您配置机器的方式无关!例如,将应用程序部署到由其他人配置的计算机(例如,系统管理员部署的 EC2 实例,可能使用 Vagrant)或者 Vagrant 根本无法配置的裸机时,这种情况非常频繁。相反,您可以使用 Vagrant 配置与开发应用程序无关的计算机 - 例如即用型 Windows IIS 框等。或者您可以使用 Vagrant 为不使用 Docker 的项目配置机器 - 例如,他们可能使用 rubygems 和 rvm 的组合来进行依赖关系管理和沙盒。
总结:Vagrant 用于管理机器,Docker 用于构建和运行应用程序环境。
如果您的目的是孤立的,我认为 Docker 就是您想要的。
Vagrant 是一个虚拟机管理器。它允许您编写虚拟机配置和配置的脚本。但是,它仍然是一个虚拟机,取决于具有巨大开销的VirtualBox (或其他)。它需要你有一个可能很大的硬盘驱动器文件,它需要很多内存,性能可能不是很好。
另一方面,Docker 通过LXC使用内核 cgroup 和命名空间。这意味着您使用的内核与主机和同一文件系统相同。您可以将 Dockerfile 与 docker docker build
命令一起使用,以便处理容器的配置和配置。你在docs.docker.com上有一个关于如何制作 Dockerfile 的例子; 它非常直观。
你想要使用 Vagrant 的唯一原因是你需要在 Ubuntu 盒子上进行 BSD,Windows 或其他非 Linux 开发。否则,去 Docker。