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

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

我正在考虑为此目的的stream浪汉或docker工人。 有什么优点和缺点,或者这些解决scheme如何比较?

如果你的目的是孤立的,我认为你想要的是Docker。

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

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

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

免责声明:我写了stream浪汉! 但是因为我写了Vagrant,所以我大部分时间都在DevOps世界里生活,其中包括像Docker这样的软件。 我和很多使用Vagrant的公司一起工作,很多人使用Docker,我看到了两者之间的相互作用。

在我说得太多之前,直接回答:在您的特定情况下(您自己单独工作,在Linux上使用Docker进行生产),您可以单独使用Docker并简化操作。 在其他许多情况下(我会进一步讨论),这并不容易。

直接比较Vagrant和Docker是不正确的。 在一些情况下,它们确实重叠,而绝大多数情况下则不重合。 实际上,比较易于比较的是Vagrant和Boot2Docker(可以运行Docker的最小操作系统)之类的东西。 在抽象方面,Vagrant是Docker上的一个级别,所以在大多数情况下它不是一个公平的比较。

stream浪者推出的东西运行的应用程序/服务的发展目的。 这可以在VirtualBox,VMware上。 它可以像AWS,OpenStack一样远程。 在这些内部,如果你使用容器,Vagrant并不关心,并且拥抱:例如,它可以自动安装,下拉,构build和运行Docker容器。 通过Vagrant 1.6,Vagrant拥有基于 Docker 的开发环境 ,并支持使用与Linux,Mac和Windows上的Vagrant相同的工作stream程的Docker。 stream浪者并不试图在这里取代Docker,它包含了Docker的实践。

Docker专门运行Docker容器。 如果您直接比较Vagrant:它是一个更具体的(只能运行Docker容器),不太灵活(需要Linux或Linux主机某处)的解决scheme。 当然,如果你正在谈论生产或CI,那就没有比较stream浪者了! stream浪者不住在这些环境中,所以应该使用Docker。

如果你的组织只为他们所有的项目运行Docker容器,并且只有在Linux上运行的开发者,那么没问题,Docker肯定能为你工作!

否则,我不认为尝试单独使用Docker是有好处的,因为你失去了很多Vagrant必须提供的东西,这些东西都有真正的商业/生产力优势:

  • Vagrant可以启动VirtualBox,VMware,AWS,OpenStack等机器。 不要紧,你需要什么,stream浪者可以启动它。 如果您使用的是Docker,Vagrant可以在其​​中任何一个上安装Docker,以便您可以使用它们。

  • Vagrant是所有项目的单一工作stream程。 换句话说,只有一点,人们必须学会运行一个项目,无论它是否在Docker容器中。 例如,如果将来有竞争对手直接与Docker竞争,那么Vagrant也可以运行它。

  • Vagrant在Windows(回到XP),Mac(回到10.5)和Linux(回到内核2.6)上运行。 在这三种情况下,工作stream程都是一样的。 如果你使用Docker,Vagrant可以启动一个可以在这三个系统上运行Docker的机器(虚拟机或者远程)。

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

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

为了解决我听到的赞成使用Docker而不是Vagrant的具体反驳论点:

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

  • “速度更快!” 一旦你拥有了可以运行Linux容器的主机,Docker在运行一个容器的速度肯定比任何虚拟机都要快。 但启动虚拟机(或远程机器)是一次性成本。 在一天中,大多数stream浪者的用户从来没有真正摧毁他们的虚拟机。 这是开发环境的一个奇怪的优化。 在Docker真正发光的产品中,我理解需要快速启动/停止容器。

我希望现在能够清楚地看到,将Docker与stream浪者进行比较是非常困难的,我相信这是不正确的。 对于开发环境,stream浪者更抽象,更一般。 Docker(以及可以使其像Vagrant一​​样行事的各种方式)是Vagrant的特定用例,忽略了Vagrant所提供的一切。

总而言之,在非常具体的使用案例中,Docker当然是Vagrant的替代品。 在大多数情况下,它不是。 Vagrant不会妨碍您使用Docker; 它实际上做了什么才能使这个经验更顺畅。 如果你发现这是不正确的,我很乐意提出改进的build议,因为Vagrant的目标是和任何系统一样工作。

希望这清除了事情!

我是Docker的作者。

简单的答案是,如果你想pipe理机器,你应该使用Vagrant。 如果你想构build和运行应用程序环境,你应该使用Docker。

Vagrant是pipe理虚拟机的工具。 Docker是一个通过将应用程序打包到轻量级容器中来构build和部署应用程序的工具。 一个容器几乎可以容纳任何软件组件及其依赖项(可执行文件,库,configuration文件等),并在一个有保证的可重复运行环境中执行它。 这使得构build应用程序变得非常简单,并将其部署到您的笔记本电脑上进行testing,然后在不同的服务器上进行实时部署等。

这是一个常见的误解,你只能在Linux上使用Docker。 这是不正确的; 您也可以在Mac上安装Docker,并且Windows支持正在进行中。 在Mac上安装时,Docker捆绑了一个微型Linux VM(磁盘上有25 MB!),它充当您的容器的包装。 一旦安装,这是完全透明的; 您可以完全相同的方式使用Docker命令行。 这为您提供了两全其美的方法:您可以使用容器来testing和开发您的应用程序,这些容器非常轻便,易于testing并且易于移动(请参阅https://index.docker.io,以便与可重复使用的容器共享Docker社区),而且您不必担心pipe理虚拟机的细节问题,而这些只是一种终结手段。;

理论上可以使用Vagrant作为Docker的抽象层。 我build议对此有两个原因:

  • 首先,stream浪者对Docker来说不是一个好的抽象。 Vagrant被devise来pipe理虚拟机。 Docker被devise来pipe理应用程序运行时。 这意味着Docker在devise上可以以更丰富的方式与应用程序进行交互,并拥有更多关于应用程序运行时的信息。 Docker中的原语是组件之间的进程,日志stream,环境variables和networking链接。 Vagrant中的原语是机器,块设备和ssh密钥。 stream浪者只是坐在较低的位置,而与容器交互的唯一方式就是假装它只是另一种机器,你可以“引导”和“login”。 所以,当然,你可以用Docker插件input“vagrant up”,而且会发生一些事情。 它是Docker可以完成的全部function的替代品吗? 尝试本地Docker几天,看看自己:)

  • 其次,locking的论点。 “如果你使用Vagrant作为抽象,你就不会被锁在Docker中!”。 从用于pipe理机器的Vagrant的angular度来看,这非常合理:容器不是另一种机器吗? 就像Amazon EC2和VMware一样,我们必须小心,不要将我们的configuration工具与任何特定的供应商联系起来! 这会造成locking – 更好地将其与Vagrant一​​起抽象出来。 除此之外完全没有考虑到Docker的重点。 Docker不configuration机器; 它将您的应用程序包装在轻便的可移植运行时中,并可以随时随地丢弃。

您为应用程序select的运行时间与您的机器configuration无关! 例如,将应用程序部署到由其他人(例如,由系统pipe理员部署的EC2实例,可能使用Vagrant)的计算机上,或者根本无法提供Vagrant根本无法提供的裸机。 相反,您可以使用Vagrant来configuration与开发应用程序无关的机器,例如可立即使用的Windows IIS框等。 或者,您可以使用Vagrant为不使用Docker的项目设置计算机 – 例如,可能使用rubygems和rvm的组合来进行依赖关系pipe理和沙箱。

总结:Vagrant是用于pipe理机器的,Docker是用于构build和运行应用程序环境的。

我在回答之前承认我没有使用Docker的经验,除了作为一个热衷的观察者,看起来是一个真正整洁的解决scheme,获得了很大的牵引力。

我对Vagrant有相当的经验,可以高度推荐。 这是一个更重量级的解决scheme,而不是基于LXC的虚拟机。 然而,我发现一个体面的笔记本电脑(8 GB RAM,i5 / i7 CPU)在开发工具的同时使用Vagrant / VirtualBox运行虚拟机并不麻烦。

与Vagrant真正伟大的事情之一是与Puppet / Chef / shell脚本进行自动化configuration的集成。 如果您正在使用其中某个选项来configuration您的生产环境,则可以创build一个与您将要获得的开发环境完全相同的开发环境,而这正是您想要的。

Vagrant的另一个伟大的事情是,您可以与您的应用程序代码一起版本您的Vagrantfile。 这意味着您的团队中的其他人都可以共享此文件,并保证每个人都使用相同的环境configuration。

有趣的是,Vagrant和Docker实际上可能是免费的。 Vagrant可以扩展到支持不同的虚拟化提供商,而Docker也许可以在不久的将来获得支持。 有关该主题的最新讨论,请参阅https://github.com/dotcloud/docker/issues/404

Vagrant-lxc是Vagrant的一个插件,让你使用LXC来configurationVagrant。 它没有默认的stream浪虚拟机(VirtualBox)具有的所有function,但它应该比Docker容器更灵活。 链接中有一段video显示了其值得关注的function。

他们是非常互补的。

我已经使用了VirtualBox,Vagrant和Docker的所有项目几个月的组合,并强烈地感受到以下好处。

在Vagrant中,你可以完全消除任何厨师独自供应,你需要你的stream浪文件做的是准备一台机器,运行一个小的shell脚本来安装docker。 这意味着我的每个项目的stream浪文件几乎是一样的,非常简单。

这是一个典型的stream浪文件

 # -*- mode: ruby -*- # vi: set ft=ruby : VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.box = "mark2" config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box" [3000, 5000, 2345, 15672, 5672, 15674, 27017, 28017, 9200, 9300, 11211, 55674, 61614, 55672, 5671, 61613].each do |p| config.vm.network :forwarded_port, guest: p, host: p end config.vm.network :private_network, ip: "192.168.56.20" config.vm.synced_folder ".", "/vagrant", :type => "nfs" config.vm.provider :virtualbox do |vb| vb.customize ["modifyvm", :id, "--memory", "2048"] vb.customize ["modifyvm", :id, "--cpus", "2"] end # Bootstrap to Docker config.vm.provision :shell, path: "script/vagrant/bootstrap", :privileged => true # Build docker containers config.vm.provision :shell, path: "script/vagrant/docker_build", :privileged => true # Start containers # config.vm.provision :shell, path: "script/vagrant/docker_start", :privileged => true end 

安装docker的Bootstrap文件看起来像这样

 #!/usr/bin/env bash echo 'vagrant ALL= (ALL:ALL) NOPASSWD: ALL' >> /etc/sudoers apt-get update -y apt-get install htop -y apt-get install linux-image-extra-`uname -r` -y apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list apt-get update -y apt-get install lxc-docker -y apt-get install curl -y 

现在得到所有我需要运行的服务我有一个docker_start脚本,看起来像这样

 #!/bin/bash cd /vagrant echo Starting required service containers export HOST_NAME=192.168.56.20 # Start MongoDB docker run --name=mongodb --detach=true --publish=27017:27017 --publish=28017:28017 dockerfile/mongodb read -t5 -n1 -r -p "Waiting for mongodb to start..." key # Start rabbitmq docker run --name=rabbitmq --detach=true --publish=5671:5671 --publish=5672:5672 --publish=55672:55672 --publish=15672:15672 --publish=15674:15674 --publish=61613:61613 --env RABBITMQ_USER=guest --env RABBITMQ_PASS=guest rabbitmq read -t5 -n1 -r -p "Waiting for rabbitmq to start..." key # Start cache docker run --name=memcached --detach=true --publish=11211:11211 ehazlett/memcached read -t5 -n1 -r -p "Waiting for cache to start..." key # Start elasticsearch docker run --name=elasticsearch --detach=true --publish=9200:9200 --publish=9300:9300 dockerfile/elasticsearch read -t5 -n1 -r -p "Waiting for elasticsearch to start..." key echo "All services started" 

在这个例子中,我正在运行MongoDB,Elastisearch,RabbitMQ和Memcached

非docker厨师独奏configuration将会相当复杂。

当您进入生产时,获得最后的好处,将开发环境转换为主机架构,这些主机架构完全相同,只需拥有足够的configuration即可运行docker,这意味着很less的工作。

如果您有兴趣,我可以在我自己的网站上获得更详细的开发环境文章

实施一个stream浪者/ Docker开发环境

现在用Vagrant你可以把Docker作为一个提供者。 http://docs.vagrantup.com/v2/docker/ 。 可以使用Docker提供者来代替VirtualBox或VMware。

请注意,您也可以使用Docker来configurationVagrant。 这与使用Docker作为提供者完全不同。 http://docs.vagrantup.com/v2/provisioning/docker.html

这意味着你可以用DockerreplaceChef或者Puppet 。 您可以使用Docker作为提供者(VM)和Chef作为提供者的组合。 或者你可以使用VirtualBox作为提供者和Docker作为提供者。

使用这两者是应用程序交付testing的重要组成部分。 我刚刚开始涉足Docker,并且非常认真地考虑一个应用程序团队,他们在构build和交付软件方面有非常复杂的问题。 想想一个典型的凤凰项目/持续交付的情况。

这个想法是这样的:

  • 拿一个Java / Go应用程序组件并将其构build为一个容器(注意,不确定该应用程序是应该在容器中构build还是构build然后安装到容器中)
  • 将容器交付给Vagrant虚拟机。
  • 对所有应用程序组件重复此操作
  • 迭代组件以编码。
  • 持续testingVagrantpipe理的虚拟机的交付机制
  • 安然无恙地知道什么时候部署容器,集成testing的发生要比Docker之前更持续的多。

这似乎是Mitchell关于Vagrant与持续交付中的Farley / Humbles思想相结合的发展的合理扩展。 如果作为一名开发人员,我可以缩小集成testing和应用程序交付的反馈环节,那么将会有更高质量和更好的工作环境。

作为一名开发人员,我始终如一地将容器交付给虚拟机,并更全面地testing应用程序,这意味着将会进一步简化产品发布。

所以我认为Vagrant的发展是利用Docker在应用程序部署方面所带来的一些糟糕的结果。

在实际的Oracle Java杂志中有一篇关于将Docker与Vagrant(和Puppet)结合使用的内容非常丰富的文章:

结论

与传统虚拟机相比,Docker的轻量级容器速度更快,已经成为开发人员和CD和DevOps计划的一部分。 如果你的目的是孤立的,Docker是一个很好的select。 Vagrant是一个虚拟机pipe理器,使您可以对单个虚拟机的configuration进行脚本configuration,也可以进行configuration。 但是,依赖于VirtualBox(或另一个VMpipe理器)的虚拟机是相当大的开销。 它要求你有一个硬盘空闲,可能是巨大的,它需要很多的内存,性能可能是不理想的。 Docker通过LXC使用内核cgroups和命名空间隔离。 这意味着你正在使用与主机和同一个系统相同的内核。 在抽象方面,stream浪者是一个高于Docker的级别,所以它们并没有真正的可比性。 诸如Puppet之类的configurationpipe理工具被广泛用于供应目标环境。 使用Docker重复使用现有的基于Puppet的解决scheme很容易。 您也可以分割您的解决scheme,所以基础设施配备了Puppet; 中间件,业务应用程序本身或两者都configuration了Docker; 而Docker被stream浪者包裹着。 有了这一系列的工具,您可以根据自己的情况做出最好的select。

如何在DevOps中构build,使用和编排Docker容器http://www.javamagazine.mozaicreader.com/JulyAug2015#&pageSet=34&page=0

绝对Docker的胜利!

您可能知道Vagrant是用于虚拟机pipe理的,而Docker是用于软件容器pipe理的。 如果您不知道其中的差别,则可以这样做:软件容器可以与其他软件容器共享相同的机器和内核。 使用容器可以省钱,因为您不必在多个操作系统上浪费更less的资源,每台服务器可以包装更多的软件,并保持良好的隔离度。

当然是一个关心自己的困境和挑战的新学科。

如果您的需求跨越单个机器资源限制,请转到Docker Swarm。