我应该使用Vagrant还是Docker来创建一个独立的环境?

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

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


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

Vagrant是一名虚拟机管理员。 它允许您脚本化虚拟机配置以及配置。 但是,它仍然是一台虚拟机,具体取决于VirtualBox(或其他)的巨大开销。 它要求你有一个可能很大的硬盘驱动器文件,它需要很多ram,性能可能不是很好。

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

你可能想要使用Vagrant的唯一原因是你需要在你的Ubuntu机器上做BSD,Windows或其他非Linux开发。 否则,去Docker。


免责声明:我写了流浪汉! 但是因为我写了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,那么与流浪者没有任何比较! 流浪者不住在这些环境中,所以应该使用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的机器(虚拟机或远程)。

  • Vagrant知道如何配置网络和同步文件夹等一些高级或非平凡的功能。 例如:Vagrant知道如何将静态IP附加到机器或转发端口,无论您使用什么系统(VirtualBox,VMware等),配置都是相同的。对于已同步的文件夹,Vagrant提供了多种机制来获取本地文件传输到远程计算机(VirtualBox共享文件夹,NFS,rsync,Samba [插件]等)。 如果您使用的是Docker,即使是没有Vagrant的虚拟机,也需要手动执行此操作,否则在这种情况下他们必须重新创建Vagrant。

  • Vagrant 1.6对基于docker的开发环境提供了一流的支持。 这不会在Linux上启动虚拟机,并会在Mac和Windows上自动启动虚拟机。 最终的结果是,在所有平台上使用Docker都是统一的,而Vagrant仍然处理诸如网络,同步文件夹等繁琐的细节。

  • 为了解决我听到的倾向于使用Docker而不是Vagrant的特定反驳论据:

  • “它是不那么活跃的部分” - 是的,它可以是,如果您专门为每个项目使用Docker。 即便如此,它仍然牺牲了Docker锁定的灵活性。 如果您决定不将Docker用于任何项目,过去,现在或将来,那么您将拥有更多移动部件。 如果你使用过流浪汉,那么你有一个移动部分支持其余部分。

  • “速度更快!” - 一旦拥有可运行Linux容器的主机,Docker运行容器的速度肯定比任何虚拟机启动时快。 但启动虚拟机(或远程机器)是一次性成本。 在一天中,大多数Vagrant用户从未真正销毁虚拟机。 这对开发环境来说是一个奇怪的优化。 在Docker真正发光的产品中,我明白需要快速旋转容器。

  • 我希望现在清楚地看到,将Docker与流浪者进行比较是非常困难的,而且我认为这是不正确的。 对于开发环境,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的抽象层。 我建议不要这样做,原因有两个:

  • 首先,流浪对于Docker来说不是一个好的抽象。 Vagrant旨在管理虚拟机。 Docker被设计为管理应用程序运行时。 这意味着Docker可以通过设计以更丰富的方式与应用程序进行交互,并拥有关于应用程序运行时的更多信息。 Docker中的原语是组件之间的进程,日志流,环境变量和网络链接。 Vagrant中的原语是机器,块设备和ssh密钥。 流浪者只是在堆栈中位置较低,它可以与容器交互的唯一方式是假装它只是另一种机器,您可以“引导”和“登录”。 所以,当然,你可以用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用于构建和运行应用程序环境。

    链接地址: http://www.djcxy.com/p/789.html

    上一篇: Should I use Vagrant or Docker for creating an isolated environment?

    下一篇: PHP: Delete an element from an array