Docker如何比Vagrant + LXC +厨师更好

Vagrant + LXC + Chef是一个很好的组合,可以自动执行基础架构任务,为开发人员构build独立的沙箱。 Docker每次都会越来越多的人群带我去问:Docker如何使用简单的bash语句来执行configuration时,Vagrant + LXC + Chef的方法如何更好呢?优点在哪里? 什么是优缺点matrix来评估正确的道路select?

在Vagrant + Chef工作stream程中,您可能会遇到以下问题:

  1. 如果将每个项目放在自己的虚拟机中,资源使用情况(在多个项目上工作时)很快变得不可行。 当然,closures和重新启动虚拟机很容易,但仍然可能有点麻烦(例如,如果您是前端devise师为每轮更新而触摸每个项目的一小部分)。
  2. 如果你把所有的项目都放在一个单独的虚拟机中,那么pipe理将是非常糟糕的,因为如果你需要不同版本的Python,Ruby等等,你将会很困难(当然你可以使用rvm或者其他类似的东西,很多额外的工作只为本地开发环境)。
  3. 当您需要构build或重build环境时,需要很长时间,部分构build或重build将会很困难:除非您在各个阶段明确创build虚拟机的快照,否则将无法保留发行版的软件包,但重新安装代码和库。
  4. 如果你依赖外部依赖(并且让我们面对它:你会的!),完全重build可能会失败,因为其中一个依赖关系被破坏(最近记住setuptools / pip和wheel包的问题?)或者镜像closures。
  5. 如果你的堆栈有多个组件(认为是“web”,“db”,“cache”等),它们可能全部安装在Vagrant虚拟机中,所产生的设置将与生产环境不同。 或者,您可以使用多个虚拟机,但请参阅问题#1!

现在,通过Docker工作stream程(有或没有厨师),将所有项目放在独立的容器中,解决问题#1和#2。 您可以有多个并行运行的项目(或同一项目的多个版本),且资源使用率适中。 即使你有大量的项目,不能同时把它们全部保存起来,停止和启动要比使用虚拟机快得多。

重build速度更快,并受益于Docker构buildcaching:使用Dockerfile定义您的服务,并且在Dockerfile中更改一行时,只需重build此步骤和后续步骤:此问题将解决问题#3。

由于registry,Docker缓解了#4问题。 您可以将构build推送到registry(公共或私有),并且如果重build失败,则只需取出先前的构build; 而且不需要拉出5GB的图像:由于分层系统,只有必要的文件将被下载。

最后但并非最不重要的一点是,Docker可以帮助解决问题#5,因为您可以以完全相同的方式在容器中运行dev和prod堆栈。 除了“在一堆虚拟机上运行prod,并且dev全部运行在一个虚拟机上”之外,还可以在容器中使用这两种虚拟机,并减less由环境之间的差异导致的副作用。

厨师是完全正交的:你可以在Docker中使用Chef(或Puppet或Ansible或Salt或…)。

Docker有什么缺点? 那么,Docker是一个年轻的产品(差不多一年,当我input这些行的时候!),所以Vagrant会更加完善,并且可能会有一些你会喜欢的function(例如重新部署到EC2或其他基础设施的可能性,一些额外的努力)。 但请记住,Docker拥有一个非常活跃的社区, 所以资源和可用帮助的数量在两种情况下都可能是相同的。

但是,stream浪+ LXC +厨师呢? 坦率地说,Vagrant + LXC的可用选项并不像Docker那么方便。 他们可能会帮助解决问题#1和#2(资源使用和隔离),但是它们不会帮助#3和#4(部分重build和构build图像的轻松推/拉)。 恕我直言,如果您喜欢Vagrant + LXC + Chef的价值主张,您将拥有与Docker相同的function(甚至更多!),并拥有更大的社区和支持。

我的2¢!

从我的观点:

  • 厨师与此事无关,因为您可以在Docker中使用或不使用您的环境configuration,如在Vagrant中。

所以真正的问题是Vagrant + LXC和Docker之间有什么区别?

  • Docker实际上是build立在LXCAUFS的 2块主砖上。
  • AUFS是一个联合文件系统 ,它允许只保存快照之间的增量 。 这意味着你可以在“父母”容器中放置几个​​容器(相当于Vagrant中的盒子),而这些盒子只会加重你添加的less数包装。 因此, 您可以根据另一个容器的以前的图像轻松地创build具有所有已安装应用程序的新容器。
  • Vagrant中 ,你启动一个盒子时用up命令设置环境。 但你不能(从我所知道的)轻松地创build快照 ,可以作为其他盒子的基地。

总结起来,我想说的是两者都完全一样,但是由于Vagrant是build立在一个更一般的概念之上的(盒子可以是虚拟机,也可以是LXC容器), Docker更专业化(它build立在LXC之上), 允许用户以有效的方式构build真正的容器层次结构 (感谢AUFS)。


编辑 :2篇文章(由Docker团队select并在他们的邮件列表上分享)已经写在这个主题上:

  • Docker vs Vagrant
  • Docker vs厨师

现在你可以拥有两全其美了。 Linux Container环境的可怕速度和可预测性; 以厨师容器为主厨的高级configurationpipe理。