我使用Ubuntu进行开发和部署,需要创建一个独立的环境。
为此,我正在考虑Vagrant或Docker。优缺点是什么,或者这些解决方案如何比较?
我使用Ubuntu进行开发和部署,需要创建一个独立的环境。
为此,我正在考虑Vagrant或Docker。优缺点是什么,或者这些解决方案如何比较?
当前回答
在实际的Oracle Java杂志上有一篇关于将Docker与Vagrant(和Puppet)结合使用的文章,内容非常丰富:
结论
Docker的轻量级容器比经典VM更快并在开发人员中流行,成为CD和DevOps的一部分主动性。如果你的目的是隔离,Docker是一个很好的选择。Vagrant是一个VM管理器,它使您能够编写单个VM以及进行资源调配。然而,它是窗台虚拟机依赖于VirtualBox(或另一个虚拟机管理器)大开销。它要求您将硬盘闲置巨大,它需要大量的RAM,并且性能可能不是最佳的。Docker公司通过LXC使用内核cgroups和命名空间隔离。这意味着您使用的内核与主机和文件系统相同。Vagrant在抽象方面比Docker高一级,因此它们是不是真正可比的。配置管理工具,如Puppet广泛用于供应目标环境。重用现有资源使用Docker,基于木偶的解决方案很简单。您还可以将解决方案,因此基础设施配备了Puppet;这个提供中间件、业务应用程序本身或两者与Docker合作;Docker被Vagrant包裹。使用此范围工具,您可以做最适合您的场景的事情。
如何在DevOps中构建、使用和协调Docker容器http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0
其他回答
肯定是Docker赢了!
您可能知道Vagrant用于虚拟机管理,而Docker用于软件容器管理。如果您不知道其中的区别,这里是:软件容器可以与其他软件容器共享相同的机器和内核。使用容器可以节省资金,因为您不会在多个操作系统(内核)上浪费资源,您可以为每台服务器打包更多的软件,保持良好的隔离度。
当然,这是一门新学科,需要关注自身的缺陷和挑战。
如果您的需求超过单机资源限制,请使用Docker Swarm。
现在使用Vagrant,您可以将Docker作为提供者。http://docs.vagrantup.com/v2/docker/.Docker提供程序可以用来代替VirtualBox或VMware。
请注意,您也可以使用Docker为Vagrant提供资源。这与使用Docker作为提供者非常不同。http://docs.vagrantup.com/v2/provisioning/docker.html
这意味着你可以用Docker代替Chef或Puppet。您可以使用Docker作为提供者(VM)和Chef作为提供者的组合。或者您可以使用VirtualBox作为提供程序,Docker作为提供程序。
我是Docker的作者。
简单的答案是,如果你想管理机器,你应该使用Vagrant。如果你想构建和运行应用程序环境,你应该使用Docker。
Vagrant是一种管理虚拟机的工具。Docker是一个通过将应用程序打包到轻量级容器中来构建和部署应用程序的工具。容器可以容纳几乎任何软件组件及其依赖项(可执行文件、库、配置文件等),并在有保证且可重复的运行时环境中执行它。这使得只需一次构建应用程序并将其部署到任何地方都变得非常容易——在笔记本电脑上进行测试,然后在不同的服务器上进行实时部署等。
一个常见的误解是,您只能在Linux上使用Docker。这是不正确的;您也可以在Mac和Windows上安装Docker。当安装在Mac上时,Docker捆绑了一个小型Linux VM(磁盘上有25 MB!),作为容器的包装器。一旦安装,这是完全透明的;您可以以完全相同的方式使用Docker命令行。这让你两全其美:你可以使用容器来测试和开发你的应用程序,容器很轻,很容易测试,也很容易移动(参见示例https://hub.docker.com用于与Docker社区共享可重用容器),并且您不必担心管理虚拟机的具体细节,无论如何,这只是实现目标的一种手段。
理论上,可以使用Vagrant作为Docker的抽象层。我反对这种做法有两个原因:
首先,Vagrant不是Docker的好抽象。Vagrant旨在管理虚拟机。Docker旨在管理应用程序运行时。这意味着Docker在设计上可以以更丰富的方式与应用程序交互,并拥有更多关于应用程序运行时的信息。Docker中的原语是进程、日志流、环境变量和组件之间的网络链接。Vagrant中的原语是机器、块设备和ssh密钥。Vagrant只是位于堆栈的较低位置,它与容器交互的唯一方式是假装它只是另一种机器,您可以“启动”和“登录”。所以,当然,你可以用Docker插件键入“floatint up”,就会发生一些很好的事情。它是否可以替代Docker所能做的全部工作?尝试本地Docker几天,自己看看:)第二,锁定争论。“如果你使用Vagrant作为抽象,你就不会被锁定在Docker中!”。从设计用于管理机器的Vagrant的观点来看,这很有道理:容器不就是另一种机器吗?就像Amazon EC2和VMware一样,我们必须小心不要将我们的资源调配工具与任何特定的供应商绑定!这会造成锁定-最好用Vagrant将其抽象化。但这完全忽略了Docker的观点。Docker不提供机器;它将您的应用程序包装在一个轻量级的可移植运行时中,该运行时可以放在任何地方。
为应用程序选择的运行时与如何配置机器无关!例如,将应用程序部署到由其他人提供的机器上(例如,系统管理员部署的EC2实例,可能使用Vagrant),或者部署到Vagrant根本无法提供的裸机上是非常常见的。相反,您可以使用Vagrant来提供与开发应用程序无关的机器,例如一个随时可用的Windows IIS盒或其他东西。或者,您可以使用Vagrant为不使用Docker的项目提供机器——例如,它们可能使用rubygems和rvm的组合进行依赖管理和沙盒。
总之:Vagrant用于管理机器,Docker用于构建和运行应用程序环境。
在实际的Oracle Java杂志上有一篇关于将Docker与Vagrant(和Puppet)结合使用的文章,内容非常丰富:
结论
Docker的轻量级容器比经典VM更快并在开发人员中流行,成为CD和DevOps的一部分主动性。如果你的目的是隔离,Docker是一个很好的选择。Vagrant是一个VM管理器,它使您能够编写单个VM以及进行资源调配。然而,它是窗台虚拟机依赖于VirtualBox(或另一个虚拟机管理器)大开销。它要求您将硬盘闲置巨大,它需要大量的RAM,并且性能可能不是最佳的。Docker公司通过LXC使用内核cgroups和命名空间隔离。这意味着您使用的内核与主机和文件系统相同。Vagrant在抽象方面比Docker高一级,因此它们是不是真正可比的。配置管理工具,如Puppet广泛用于供应目标环境。重用现有资源使用Docker,基于木偶的解决方案很简单。您还可以将解决方案,因此基础设施配备了Puppet;这个提供中间件、业务应用程序本身或两者与Docker合作;Docker被Vagrant包裹。使用此范围工具,您可以做最适合您的场景的事情。
如何在DevOps中构建、使用和协调Docker容器http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0
Vagrant lxc是Vagrant的一个插件,让您使用lxc来提供Vagrant。它没有默认流浪VM(VirtualBox)所具有的所有功能,但它应该比docker容器更灵活。链接中有一段视频显示了它的功能,值得观看。