我使用Ubuntu进行开发和部署,并且需要创建一个隔离的环境。
我正在考虑为此目的使用Vagrant或Docker。优缺点是什么,或者这些解决方案相比如何?
我使用Ubuntu进行开发和部署,并且需要创建一个隔离的环境。
我正在考虑为此目的使用Vagrant或Docker。优缺点是什么,或者这些解决方案相比如何?
Answers:
如果您的目的是隔离,那么我认为Docker是您想要的。
Vagrant是虚拟机经理。它允许您编写虚拟机配置和配置脚本。但是,它仍然是虚拟机,取决于VirtualBox(或其他),具有巨大的开销。它要求您拥有一个巨大的硬盘文件,需要大量内存,并且性能可能不是很好。
另一方面,Docker通过LXC使用内核cgroup和命名空间。这意味着您使用与主机相同的内核和相同的文件系统。您可以将Dockerfile与docker build
命令配合使用,以处理容器的配置和配置。您在docs.docker.com上有一个有关如何制作Dockerfile的示例;这是非常直观的。
您可能要使用Vagrant的唯一原因是,如果需要在Ubuntu机器上进行BSD,Windows或其他非Linux开发。否则,选择Docker。
免责声明:我写了Vagrant!但是因为我写了Vagrant,所以我将大部分时间都花在DevOps世界中,其中包括Docker之类的软件。我与许多使用Vagrant的公司合作,许多使用Docker,并且我看到两者之间如何相互作用。
在我讲得太多之前,有一个直接的答案:在您的特定情况下(您自己工作,在Linux上工作,在生产中使用Docker),您可以单独使用Docker并简化事情。在许多其他情况下(我将进一步讨论),这并不是那么容易。
直接比较Vagrant和Docker是不正确的。在某些情况下,它们确实重叠,而在绝大多数情况下却不重叠。实际上,比较合适的比较是Vagrant与类似Boot2Docker(可以运行Docker的最小操作系统)之类的东西。在抽象性方面,Vagrant比Docker高一个级别,因此在大多数情况下,它不是一个公平的比较。
Vagrant出于开发目的启动运行应用程序/服务的事物。这可以在VMware的VirtualBox上。它可以像AWS,OpenStack一样是远程的。在这些容器中,如果您使用容器,则Vagrant不在乎,并接受它:例如,它可以自动安装,下拉,构建和运行Docker容器。在Vagrant 1.6中,Vagrant具有基于docker的开发环境,并支持在Linux,Mac和Windows上以与Vagrant相同的工作流程使用Docker。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的开发环境提供了一流的支持。这不会在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的目标是在任何系统上均能正常工作。
希望这可以清除一切!
vagrant provision
)。
我是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插件键入“ 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用于构建和运行应用程序环境。
作为我的回答的开头,我承认我没有使用Docker的经验,只是作为一个狂热的观察者,这看起来像是一种非常整洁的解决方案,并且吸引了很多人。
我对Vagrant确实有相当丰富的经验,可以强烈推荐它。就基于VM而不是基于LXC而言,这无疑是一个更重量级的解决方案。但是,我发现一个不错的笔记本电脑(8 GB RAM,i5 / i7 CPU)在使用Vagrant / VirtualBox和开发工具一起运行VM时没有问题。
Vagrant真正很棒的事情之一是与Puppet / Chef / shell脚本的集成,用于自动配置。如果使用这些选项之一来配置生产环境,则可以创建一个开发环境,该开发环境与您将要获得的开发环境几乎相同,而这正是您想要的。
Vagrant的另一个优点是您可以将Vagrantfile和应用程序代码一起版本化。这意味着团队中的其他所有人都可以共享此文件,并且可以确保每个人都使用相同的环境配置。
有趣的是,Vagrant和Docker实际上可能是互补的。Vagrant可以扩展为支持不同的虚拟化提供程序,而Docker可能是这样的提供程序之一,并在不久的将来获得支持。请参阅https://github.com/dotcloud/docker/issues/404,以获取有关该主题的最新讨论。
它们是非常互补的。
我将VirtualBox,Vagrant和Docker的组合用于我的所有项目已有几个月,并且强烈感受到了以下好处。
在Vagrant中,您可以完全取消任何Chef单人配置,而您需要做的vagrant文件仅是准备一台运行单个安装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,这实际上意味着很少的工作。
如果您有兴趣,可以在我自己的网站上找到有关开发环境的更详细的文章,网址为:
Vagrant-lxc是Vagrant的插件,让您使用LXC来配置Vagrant。它没有默认游民虚拟机(VirtualBox)具有的所有功能,但与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,并非常认真地考虑一个应用程序团队,该团队在构建和交付其软件方面具有极其复杂的条件。想想经典的Phoenix项目/持续交付情况。
这种想法是这样的:
这似乎是米切尔(Mitchell)的说法的逻辑延伸,该说法是“流浪者”是用于发展的,并结合了“持续交付”中的Farley / Humbles思维。如果我作为开发人员能够缩小集成测试和应用交付方面的反馈循环,那么将会出现更高质量和更好的工作环境。
作为开发人员,我一直在不断地向VM发送容器并更全面地测试应用程序,这意味着将进一步简化生产版本。
因此,我将Vagrant演变为一种利用Docker对应用程序部署产生的可怕后果的方式。
绝对是Docker的胜利!
如您所知,Vagrant用于虚拟机管理,而Docker用于软件容器管理。如果您不知道它们之间的区别,则为:一个软件容器可以与其他软件容器共享同一台机器和内核。使用容器可以节省资金,因为您不会浪费多个操作系统(内核)上的资源,因此每个服务器可以打包更多软件,从而保持良好的隔离度。
当然,这是一门应对自己的难题和挑战的新学科。
如果您的需求超出了单机资源限制,请选择Docker Swarm。
在实际的Oracle Java杂志上,有一篇非常有用的文章,内容涉及将Docker与Vagrant(和Puppet)结合使用:
结论
与传统的VM相比,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