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

时间:2013-05-20 10:05:25

标签: vagrant docker

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

我正在考虑为此目的使用Vagrant或Docker。有哪些优点和缺点,或者这些解决方案如何比较?

10 个答案:

答案 0 :(得分:2276)

免责声明:我写过Vagrant!但是因为我写了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-based development environments,并支持在Linux,Mac和Windows上使用与Vagrant相同的工作流程。 Vagrant并没有尝试在这里取代Docker,它包含了Docker的做法。

Docker专门运行Docker容器。如果您直接与Vagrant进行比较:它特别是更具体(只能运行Docker容器),灵活性较低(需要Linux或Linux主机某处)解决方案。当然,如果您正在谈论生产或CI,那么就没有Vagrant的比较了! Vagrant不会生活在这些环境中,所以应该使用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的计算机(VM或远程)。

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

  • Vagrant 1.6拥有docker-based development environments的一流支持。这不会在Linux上启动虚拟机,并将在Mac和Windows上自动启动虚拟机。最终结果是,使用Docker在所有平台上都是统一的,而Vagrant仍然处理网络,同步文件夹等事情的繁琐细节。

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

  • "运动部件较少" - 是的,如果你专门为每个项目使用Docker,它可以。即便如此,它还是牺牲了Docker锁定的灵活性。如果您决定不将Docker用于过去,现在或将来的任何项目,那么您将拥有更多移动部件。如果您使用过Vagrant,那么您就拥有了支持其余部分的移动部件。

  • "它更快!" - 一旦你拥有可以运行Linux容器的主机,Docker在运行容器方面肯定比任何虚拟机都要快。但启动虚拟机(或远程机器)是一次性成本。在一天中,大多数Vagrant用户从未真正销毁他们的VM。这对于开发环境来说是一种奇怪的优化。在Docker真正发光的生产中,我理解需要快速旋转/缩小容器。

我希望现在可以清楚地看到,将Docker与Vagrant进行比较是非常困难的,而且我认为这是不正确的。对于开发环境,Vagrant更抽象,更通用。 Docker(以及使其表现得像Vagrant的各种方式)是Vagrant的特定用例,忽略了Vagrant提供的所有其他功能。

总之:在高度特定的用例中,Docker肯定是Vagrant的可能替代品。在大多数用例中,事实并非如此。 Vagrant并不妨碍您使用Docker;它实际上做了它可以使体验更顺畅的事情。如果您发现这不是真的,我很乐意接受改进建议,因为Vagrant的目标是与任何系统同等运作。

希望这可以解决问题!

答案 1 :(得分:1362)

答案 2 :(得分:1105)

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

Vagrant是一个虚拟机管理器。它允许您编写虚拟机配置和配置的脚本。但是,它仍然是一个虚拟机,取决于具有巨大开销的VirtualBox(或其他)。它需要你有一个可能很大的硬盘驱动器文件,它需要很多内存,性能可能不是很好。

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

你想要使用Vagrant的唯一原因是你需要在Ubuntu盒子上进行BSD,Windows或其他非Linux开发。否则,请转到Docker。

答案 3 :(得分:80)

我接受了我的回复,承认我没有使用Docker的经验,除了作为一个看起来非常简洁的解决方案的狂热观察者,它正在获得很大的吸引力。

我对Vagrant有相当多的经验并且可以强烈推荐它。就基于VM而非基于LXC而言,它肯定是一个更重量级的解决方案。但是,我发现一台像样的笔记本电脑(8 GB RAM,i5 / i7 CPU)使用Vagrant / VirtualBox和开发工具一起运行虚拟机没有问题。

Vagrant最棒的一点就是与Puppet / Chef / shell脚本集成以实现自动化配置。如果您正在使用其中一个选项来配置生产环境,那么您可以创建一个与您将要获得的完全相同的开发环境,这正是您想要的。

Vagrant的另一个好处是你可以将你的Vagrant文​​件和你的应用程序代码一起发布。这意味着团队中的其他人都可以共享此文件,并确保每个人都使用相同的环境配置。

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

答案 4 :(得分:59)

它们非常互补。

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

在Vagrant中,您可以完全取消任何Chef solo配置,并且您需要的所有流浪文件都要准备一台运行安装docker的单个小shell脚本的计算机。这意味着每个项目的Vagrantfiles几乎完全相同且非常简单。

这是典型的Vagrantfile

# -*- 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 Chef独奏配置会相当复杂。

当你进入生产阶段,将开发环境转换为完全相同的主机基础设施时,可以获得最后一大优势,因为他们只有足够的配置来运行docker意味着确实很少工作。

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

Implementing A Vagrant / Docker Development Environment

答案 5 :(得分:51)

Vagrant-lxc是Vagrant的一个插件,让你使用LXC来提供Vagrant。它没有默认的vagrant VM(VirtualBox)所具有的所有功能,但它应该允许您比docker容器更灵活。链接中有一个视频,显示其值得观看的功能。

答案 6 :(得分:45)

现在使用Vagrant可以将Docker作为提供者。 http://docs.vagrantup.com/v2/docker/。可以使用Docker提供程序代替VirtualBox或VMware。

请注意,您也可以使用Docker配置Vagrant。这与使用Docker作为提供者非常不同。 http://docs.vagrantup.com/v2/provisioning/docker.html

这意味着您可以使用Docker替换ChefPuppet。您可以使用Docker这样的组合作为提供者(VM)和Chef作为配置者。或者您可以将VirtualBox用作提供程序,将Docker用作配置程序。

答案 7 :(得分:14)

使用两者是应用程序交付测试的重要部分。我刚刚开始参与Docker并且非常认真地思考一个在构建和交付软件方面复杂性很大的应用程序团队。想想经典的凤凰项目/持续交付情况。

思维是这样的:

  • 获取Java / Go应用程序组件并将其构建为容器 (注意,不确定应用程序是应该在容器中构建还是构建的 安装到容器上)
  • 将容器交付给Vagrant VM。
  • 对所有应用程序组件重复此操作。
  • 迭代要编码的组件。
  • 持续测试由Vagrant管理的VM的传送机制
  • 知道什么时候部署容器时很好地睡觉,集成测试比Docker之前更加持续。

这似乎是Mitchell声明Vagrant的发展与Farley / Humbles在持续交付中思考的合理延伸。如果我作为开发人员可以缩小集成测试和应用程序交付的反馈循环,那么将会有更高质量和更好的工作环境。

作为开发人员,我不断一致地向VM提供容器并更全面地测试应用程序,这意味着生产版本将进一步简化。

所以我看到Vagrant的发展是为了利用Docker对应用程序部署所带来的一些可怕后果。

答案 8 :(得分:9)

绝对是Docker的胜利!

您可能知道Vagrant用于虚拟机管理,而Docker用于软件容器管理。 如果你不知道差异,这里是: 软件容器可以与其他软件容器共享同一台机器和内核。使用容器可以节省资金,因为您不会在多个操作系统(内核)上浪费资源,您可以为每台服务器打包更多软件,保持良好的隔离度。

当然,这是一门关注自身陷阱和挑战的新学科。

如果您的要求超过单一计算机资源限制,请转到Docker Swarm。

答案 9 :(得分:7)

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

<强>结论

  

与传统虚拟机相比,Docker的轻量级容器更快   并且已经在开发人员中流行,并且作为CD和DevOps的一部分   举措。如果您的目的是隔离,Docker是一个很好的选择。   Vagrant是一个VM管理器,可以让您编写脚本配置   单个虚拟机以及配置。然而,它是基石   VM相对于VirtualBox(或另一个VM管理器)依赖   开销很大。它要求你有一个可以空闲的硬盘驱动器   巨大的,需要大量的RAM,性能可能不是最理想的。搬运工人   通过LXC使用内核cgroup和名称空间隔离。这意味着   您正在使用与主机相同的内核和相同的ile系统。   在抽象方面,Vagrant比Docker高出一个级别,所以它们是   不太可比。配置管理工具,如Puppet   广泛用于配置目标环境。重用现有的   Docker可以轻松实现基于Puppet的解决方案。你也可以切片   解决方案,因此基础设施配置了Puppet;该   中间件,业务应用程序本身或两者都已配置   与Docker;和Docker被Vagrant包裹着。有了这个范围   工具,你可以做你最好的方案。

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