首页 文章

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

提问于
浏览
1926

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

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

10 回答

  • 1315

    我接受了我的回复,承认我没有使用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 .

  • 13

    如果您的目的是孤立的,我认为Docker就是您想要的 .

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

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

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

  • 2215

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

    Conclusion

    与传统虚拟机相比,Docker的轻量级容器更快,并且已经在开发人员中流行,并且作为CD和DevOps计划的一部分 . 如果您的目的是隔离,Docker是一个很好的选择 . Vagrant是一个VM管理器,使您可以编写各个VM的配置脚本以及进行配置 . 但是,它依赖于具有相对较大开销的VirtualBox(或另一个VM管理器)的VM . 它要求你有一个可能很大的硬盘空闲,它需要大量的RAM,性能可能不是最理想的 . Docker通过LXC使用内核cgroup和名称空间隔离 . 这意味着您使用的是与主机相同的内核和相同的ile系统 . 在抽象方面,Vagrant比Docker高出一个级别,因此它们并不具有可比性 . Puppet等配置管理工具广泛用于配置目标环境 . Docker可以轻松地重用现有的基于Puppet的解决方案 . 您还可以对解决方案进行切片,以便为基础架构配置Puppet;中间件,业务应用程序本身或两者都配置了Docker;和Docker被Vagrant包裹着 . 使用这一系列工具,您可以为您的场景做最好的事情 .

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

  • 51

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

  • 8

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

    思路是这样的:

    • 获取Java / Go应用程序组件并将其构建为容器(注意,不确定应用程序是应该在容器中构建还是构建然后安装到容器中)

    • 将容器传递给Vagrant VM .

    • 对所有应用程序组件重复此操作 .

    • 迭代要编码的组件 .

    • 连续测试由Vagrant管理的VM的交付机制

    • 知道什么时候需要部署容器,整合测试是在比Docker之前更持续的基础上进行的 .

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

    事实上,作为开发人员,我始终如一地向VM提供容器并更全面地测试应用程序意味着 生产环境 版本将进一步简化 .

    因此,我认为Vagrant的发展是为了利用Docker对应用程序部署所带来的一些可怕后果 .

  • 1066

    免责声明:我写了Vagrant!但是因为我写了Vagrant,我把大部分时间都花在DevOps世界中,其中包括像Docker这样的软件 . 我和许多使用Vagrant的公司合作,很多人使用Docker,我看到两者如何相互影响 .

    Before I talk too much, a direct answer: 在您的特定场景中(您自己独立工作,在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的目标是与任何系统同等运作 .

    希望这可以解决问题!

  • 76

    我是Docker的作者 .

    简短的回答是,如果你想管理机器,你应该使用Vagrant . 如果您想构建和运行应用程序环境,则应使用Docker .

    Vagrant是一种管理虚拟机的工具 . Docker是一种通过将应用程序打包到轻量级容器中来构建和部署应用程序的工具 . 容器可以容纳几乎任何软件组件及其依赖项(可执行文件,库,配置文件等),并在保证且可重复的运行时环境中执行它 . 这使得构建应用程序并在任何地方进行部署非常容易 - 在笔记本电脑上进行测试,然后在不同的服务器上进行实时部署等 .

    它's a common misconception that you can only use Docker on Linux. That'不正确;你也可以在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插件键入“vagrant up”,并且会发生一些相当不错的事情 . 它是Docker可以做的全部广度的替代品吗?尝试本机Docker几天,亲眼看看:)

    • 其次,锁定参数 . “如果你使用Vagrant作为抽象,你将不会被锁定在Docker中!” . 从设计用于管理机器的Vagrant的角度来看,这非常有意义:容器不仅仅是另一种机器吗?就像Amazon EC2和VMware一样,我们必须小心不要将我们的配置工具与任何特定供应商联系起来!这将创建锁定 - 更好地用Vagrant将它全部抽象出来 . 除此之外,完全错过了Docker的观点 . Docker不提供机器;它将您的应用程序包装在轻量级的可移植运行时中,可以在任何地方删除

    您为应用程序选择的运行时与您配置机器的方式无关!例如,将应用程序部署到由其他人配置的计算机(例如,系统管理员部署的EC2实例,可能使用Vagrant)或者Vagrant根本无法配置的裸机时,这种情况非常频繁 . 相反,您可以使用Vagrant来配置与开发应用程序无关的计算机 - 例如即用型Windows IIS框等 . 或者您可以使用Vagrant为不使用的项目配置机器Docker - 也许他们使用rubygems和rvm的组合来进行依赖管理和沙盒化 .

    总结:Vagrant用于管理机器,Docker用于构建和运行应用程序环境 .

  • 45

    它们非常互补 .

    几个月来,我一直在为所有项目使用VirtualBox,Vagrant和Docker的组合,并且强烈感受到以下好处 .

    在Vagrant中,您可以完全取消任何Chef独奏配置,并且您需要的所有流浪文件都要准备一台运行一个安装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

  • 7

    Definitely Docker for the win!

    您可能知道Vagrant用于虚拟机管理,而Docker用于软件容器管理 . 如果您不了解其中的区别,请执行以下操作:软件容器可以与其他软件容器共享同一台计算机和内核 . 使用容器可以省钱,因为您不会在多个操作系统(内核)上浪费资源,您可以为每台服务器打包更多软件,保持良好的隔离度 .

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

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

  • 57

    现在使用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作为配置程序 .

相关问题