我使用Ubuntu进行开发和部署,需要创建一个独立的环境。
为此,我正在考虑Vagrant或Docker。优缺点是什么,或者这些解决方案如何比较?
我使用Ubuntu进行开发和部署,需要创建一个独立的环境。
为此,我正在考虑Vagrant或Docker。优缺点是什么,或者这些解决方案如何比较?
当前回答
现在使用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是一个虚拟机管理器。它允许您编写虚拟机配置以及资源调配的脚本。然而,它仍然是一个依赖VirtualBox(或其他)的虚拟机,开销巨大。它需要你有一个巨大的硬盘文件,它需要很多内存,而且性能可能不是很好。
另一方面,Docker通过LXC使用内核cgroup和命名空间。这意味着您正在使用与主机相同的内核和相同的文件系统。您可以将Dockerfile与docker build命令一起使用,以便处理容器的供应和配置。你在docs.docker.com上有一个关于如何制作Dockerfile的示例;这是非常直观的。
如果您需要在Ubuntu上进行BSD、Windows或其他非Linux开发,那么您可以使用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有相当丰富的经验,并强烈推荐它。就基于VM而不是基于LXC而言,它无疑是一个更重量级的解决方案。然而,我发现一台不错的笔记本电脑(8GB RAM,i5/i7 CPU)在使用Vagrant/VirtualBox和开发工具运行VM时没有问题。
Vagrant真正伟大的一点是与Puppet/Chef/shell脚本的集成,以实现自动配置。如果您使用这些选项之一来配置您的生产环境,那么您可以创建一个与您将要获得的几乎完全相同的开发环境,这正是您想要的。
Vagrant的另一个优点是,您可以将Vagrant文件与应用程序代码一起进行版本化。这意味着团队中的其他所有人都可以共享此文件,并且保证每个人都使用相同的环境配置。
有趣的是,Vagrant和Docker实际上可能是互补的。Vagrant可以扩展到支持不同的虚拟化提供商,Docker可能就是其中一个在不久的将来获得支持的提供商。看见https://github.com/dotcloud/docker/issues/404最近关于该主题的讨论。
现在使用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,并非常努力地思考一个在构建和交付软件方面非常复杂的应用程序团队。想象一个典型的菲尼克斯项目/持续交付情况。
思路大致如下:
将Java/Go应用程序组件构建为容器(注意,不确定应用程序是应该在容器中构建还是在安装到容器上)将容器交付给Vagrant VM。对所有应用程序组件重复此操作。对要进行代码编写的组件进行迭代。持续测试Vagrant管理的VM的交付机制睡个好觉,知道什么时候该部署容器了,集成测试比Docker之前更为持续。
这似乎是米切尔在《持续交付》中关于Vagrant是为了发展与Farley/Humbles思维相结合的说法的逻辑延伸。如果我作为一名开发人员,能够缩小集成测试和应用程序交付的反馈回路,那么更高质量和更好的工作环境将随之而来。
作为一名开发人员,我一直在不断地向VM交付容器,并更全面地测试应用程序,这意味着生产版本将进一步简化。
因此,我认为Vagrant是一种利用Docker对应用程序部署带来的一些可怕后果的方式。