为什么我应该使用Vagrant而不是VirtualBox?


230

我使用VirtualBox多年来创建开发环境。

我的很多同事都在谈论Vagrant,许多人对此感到非常兴奋,但我似乎无法掌握它的好处。在我看来,这是一系列需要学习的新命令我用Virtualbox做的事情。

使用VirtualBox,我可以完美地安装和配置环境,然后可以将其打包为OVA或其他任何形式,并与其他办公室用户共享。如果出现问题,可以在VirtualBox中拍摄快照。

木偶和厨师不是Vagrant的一部分,他们是对的吗?

因此,是的,Vagrant单独提供的优于VirtualBox的好处是什么?


11
两年了,我现在每天都在使用Vagrant进行开发-太好了!我的团队使用它并解决了我们的开发环境问题。
约翰·亨特2016年

1
在这里认为:如果您在设置PXE服务器方面从未遇到任何麻烦,请完全了解VBoxManage,知道如何在不到一分钟的时间内设置nfs,等等,并且还像直接管理构建链一样。. 价值与您所缺少的难题的每个部分都息息相关。广泛的使用不是来自人偶的整合,而是因为人们可以在互联网上立即对被感染的图像进行安全漏洞检测。不管他们告诉你什么。
Florian Heigl

2
3.5年过去了,我现在每天都使用docker进行开发。很好,但是与无业游民不同……根据您的要求,我相信无业游民对于团队来说仍然是一个更好的开发平台-使用起来更容易。
约翰·亨特

5
4年过去了,我发现docker很糟糕。流浪汉万岁。
约翰·亨特

3
您的评论让这变得更加有趣
Florian Heigl '18

Answers:


151

这是一个很大的问题,所以我将其分为三个部分。

流浪汉

Vagrant用于通过以下方式设置一个或多个虚拟机:

  • 导入预制图像(称为“框”)
  • 设置特定于VM的设置(IP地址,主机名,端口转发,内存等)
  • 运行配置软件,例如Puppet或Chef

请注意,它不会在加载VM和设置VirtualBox设置之前安装软件或设置计算机。将其视为VirtualBox的脚本引擎。

这是一些我仅在VirtualBox上使用Vagrant的原因。

1.轻松设置多虚拟机网络

我阅读的大多数Vagrant高级用户内容都是关于同时设置多个VM的。Vagrant提供了一个配置文件来进行设置,使您可以使用一个命令启动所有配置文件。

假设您已经配置了三个虚拟机,以使用192.168.1。*子网上的静态IP相互联网。您发现自己已经在使用该子网分发IP地址的位置,并且您的VM现在发生冲突。使用Vagrant,您可以简单地编辑Vagrantfile并重新加载VM,而如果使用VirtualBox,则必须打开每个VM的设置(如果不启动每个VM并在内部进行更改)。

2.源代码管理

通过将设置放在文本文件中,可以将配置置于源代码管理下。上周进行了一些更改,并意外破坏了图像?只需还原更改并重新加载VM。您可以使用VirtualBox快照来完成此操作,但是它将占用比Vagrantfile更大的空间。

3.各种平台

http://vagrantbox.es等网站上有大量可用的盒子。这使您可以尝试各种操作系统或发行版,并应用相同的设置来设置相似的环境。这可以帮助测试或添加对新平台的支持,并且仅使用VirtualBox将非常耗时。

使用预配软件以及使用映像快照存在很多争论。有关其他讨论,我将为您提供Stephen Nelson-Smith的出色文章“ 如何在一天内构建100个Web服务器”


8
但是,我仍然不明白为什么要在开发环境中使用流浪汉!因为,这很昂贵(如果您想使用VMWare!),我们可以准备一个虚拟机,例如基础盒,由vagrant使用,然后由VMware克隆以设置另一个虚拟机。首先,我们可以vmrun通过VMware提供的命令控制所有虚拟机设置,甚至可以更改IP地址或在来宾计算机中运行脚本!
奥古兹Çelikdemir

3
@OğuzÇelikdemir这是一个公平的观点。Vagrant只是将VMWare的前端放到了新机器上。在幕后,它vmrun用来控制它。我一直使用VirtualBox,因此对VMWare后端没有任何经验。
亚当·卢肯斯

1
@AdamLukens,感谢您的详细评论。您提到的内容听起来很有趣..但是我不知道您是否知道该VboxManage命令?virtualbox.org/manual/ch08.html 您提到的几乎所有内容都可以通过将特定的ip / parameter传递vboxmanage controlvm给Shell脚本中的类似命令或类似命令,然后对其进行版本控制来创建为脚本。那么,如何vagrant改进virtualbox
alpha_989 '18

@ alpha_989我同意。使用Vagrant似乎没有独特之处。只是为了方便。
Niklas Rosencrantz

27

除了亚当给出的出色答案外,瓦格兰特还将所有事物联系在一起。尽管Chef和Puppet(以及Salt和Shell脚本以及您要使用的任何其他预配器)是分开的东西,但Vagrant会将它们捆绑在一起,并使其仅使用a即可vagrant up

那一条命令会

  1. 只需启动VM(如果需要的话),但这也可以
  2. 如果还没有从您指定的基础框中创建该框,但是如果您的计算机上没有该基础框,那么它将首先
  3. 从其URL提取它并将其下载到您的计算机。

您不必考虑所有这些。假设您要切换到另一个项目,这个项目是由同事启动的。您只需从存储库中签出代码并运行vagrant up,就不必担心下载ISO或安装任何内容,也不用担心要为该特定客户端使用哪个发行版的版本,或者是否已经拥有了包含所有功能的VM副本。你需要。

您甚至不必担心他们是使用Chef还是Puppet或仅使用Shell脚本来设置内容。(好的,因此您可能需要做一个bundle install或其他步骤,以确保已安装所有内容,但仍然没什么大不了的。)

通过将所有内容捆绑在一起,并为其提供统一的界面,它可以使最简单的用例之外的所有内容变得更加容易。刚开始时,您可能会觉得自己只是在重新学习做已做的事情的新方法,但是一旦您深入了解Vagrant的用法,您会发现您可以用更少的精力做更多的事情。初期投资非常值得。


8
但是,给开发人员发送预设的VM映像比让他们安装无用的软件,学习如何使用它以及处理出现的许多问题(特别是在支持时)要容易得多,而且对我来说,这是一件容易的事。窗户盒。我也真的不明白。似乎只是狂热分子。
hopeseekr

5
这些天,安装Vagrant非常简单。任何无法安装它的人都不可能被信任来编写代码。开发人员签出的源代码中包含Vagrantfile实际上比发送VM容易得多。Vagrantfile定义设置,包括从中下载基本VM的URL(然后由它配置)。如果您最初不需要进行配置更改,那么一切都准备就绪。但是当您处理项目时,可能需要进行更改。在您的Vagrantfile中执行此操作。
iconoclast

5
由于您将Vagrantfile与代码一起保存,所有加入该项目的开发人员都将自动获取您对VM所做的更改,因为您是在Vagrantfile中进行更改的。配置您的Vagrantfile并不困难。如果发现Chef和Puppet过大(通常是过大的),则可以使用shell设置。如果您可以在VM中输入shell命令,那么在Vagrantfile中设置shell设置命令是一个很小的障碍。从长远来看,这将需要少量的前期工作,并可以节省许多麻烦。
iconoclast

4
以及何时需要在所有50台计算机上进行更改?
iconoclast

4
这里的讨论实际上是关于过早的优化。如果您不需要,请不要使用无业游民。当发现创建VM变得乏味时,请使用流浪汉。
cammil

9

能否将Chef或puppet与VM设置集成在一起是关键。大多数“无业游民”用户会告诉您,他们比“无业游民”或“无偿毁灭”更频繁地执行“无业游民供应”,并且有时“无业游民重新装填”的频率更高。这些任务表明,真正的工作不是启动/关闭虚拟机,而是在事后“管理”它们。

提出一个更好的问题(无论如何,都是由熟练的Chef用户提出的)可能是为什么要使用Vagrant而不是使用适当的插件(稍后将进入virtualbox插件)?例如,将数据包中存储的参数值传递给刀插件比(处理)一个巨大的Vagrantfile更加智能,灵活和可管理。我通常在厨师数据包中定义我的“动态”资源,例如CPU数量,内存量,要部署的OS,主机名,IP,路由等,这样我就无需不断更改配方;- )。通过Chef Web界面编辑数据袋是一个非常容易的数据输入任务,我可以交给大多数初级操作员。使用Vagrantfile,您可以永久修改代码,无论您相信与否,都会发现代码中断-这几乎可以确保您不会将简单的更改交给操作人员,

除了刀子还没有用于virtualbox的插件(尽管我在不久的将来设想了一个插件)外,大多数“企业”虚拟化产品已经有插件,包括vmware,xenserver和几乎每个主要的“云”提供商。这意味着如果/当您准备移出VirtualBox时,刀远远优于Vagrant提供的工具。目前,Chef社区似乎很乐意通过不为刀子插件集成virtualbox api来让virtualbox用户与Vagrant一​​起li行。有一个刀无用的插件,它确实允许使用数据包来传递参数。但是,它仍然需要流浪者软件,并且它是单片的Vagrantfile才能起作用。

所以,我会弯腰说瓦格兰特绝对不比用刀厨师好。但是(现在)有必要,如果您坚持使用VirtualBox,并且可能比管理带有数据袋的厨师更“容易”,前提是您要管理的环境非常简单。


8

这是流浪汉简化的另外两个开发人员用例(在“普通” VirtualBox上)。在以前的答案中,我没有看到这些用例特别注明。

  1. Vagrant的目标是使开发平台与生产平台尽可能地接近。在理想的情况下,您将使用用于供应Vagrant VM的THE SAME脚本来供应生产环境,从而最大程度地减少部署时的意外情况。

  2. 集成测试和连续集成:Vagrant易于通过测试进行控制,因此在进行测试运行时,可以轻松地通过诸如Jenkins之类的工具来控制整个多机堆栈。

是的,“纯” VirtualBox也可以在这里使用-但流浪汉使用的约定使设置这些方案更加简单。


1
我认真地只是将vmx和vmdk从Windows复制到Linux。也许在virtualbox世界中是不同的,但我对此表示怀疑!有什么更容易的?复制文件或使vagrantfile混乱,以及无数可能出错的问题?
hopeseekr 2014年

6
更确切地说,可以将Vagrant看作是一种虚拟定义语言,可以描述虚拟机的特性,而与虚拟机是托管在VirtualBox,VMware,Parallels还是您拥有的功能无关。了解Vagrant如何不是“竞争” VirtualBox,而是与其配合使用,甚至超越它。
MarkHu

人们通常会使用Vagrantfile来描述如何为项目设置虚拟机-Vagrantfile将被提交给项目的源代码控制(git等),以便在GitHub等上共享。下载起来要小得多而不是整个VMDK。
本XO

0

Vagrant抽象了虚拟机,因此您可以轻松切换虚拟机的实现。您可以从Virtual Box切换到AWS或Digital Ocean。就像使用SQL而不是特定于数据库的查询语言一样。

Vagrant允许开发人员仅使用一个命令即可快速设置环境,并且与其他所有人的命令完全相同。这对于开发人员经常来来往往的大公司很重要。它可以将设置时间从3天减少到1小时。

+亚当说了什么。

(尽管我仍然没有发现Chef或Puppet的用途...)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.