以下内容均出自Vagrant作者(Mitchell Hashimoto)与Docker作者(Solomon Hykes)在stackoverflow上面一个问题讨论。在这个问题中,双方阐述了vagrant和docker的特点和使用范围,对于深入理解vagrant和docker很有意义,因此笔者翻译出来,以供大家讨论学习。 Mitchell作为vagrant的作者,其在DevOps的世界里面沉浸多年,接触了很多类似docker的虚拟化软件。他目前接触了很多使用vagrant和docker的场景,所以看到了两者是如何相互搭配发生作用的。 他认为如果单单是开发人员一个人单独使用主机,使用docker可以简化很多事情,这种场景下使用docker和vagrant都没有什么区别。所以他更多的讨论了一些复杂场景,在这些复杂场景中,docker和vagrant就有一些区别了。 以下是他原文: 不分场景而直接比对vagrant和docker是不恰当的!在一些简单场景中,它们两款产品作用是重复的,但在更多场景中,它们两款产品无法相互替代。事实上,vagrant抽象度比docker更高,因此直接用vagrant同docker相比较是不恰当的。而把vagrant同Boot2Docker(一款运行docker最小的内核) 进行比较似乎更加恰当。 vagrant为了支持开发,在启动虚拟机环境时启动了很多的应用和服务。vagrant可以在VirtualBox, VMware上面运行(docker无法执行)。vagrant也可以在AWS, OpenStack这些云环境中运行。即便你使用了docker的容器,vagrant同样也没问题。vagrant可以自动install, pull down, build, run Docker containers。 比如在vagrant V1.6版本中,vagrant集成了docker-based development environments,因此Vagrant可以在windows,mac和linux上面提供docker服务。 vagrant没有想替代docker的想法,相反它还包含了docker的一些特性。 如果我们从逻辑层面来比较vagrant和docker的话,那么: 1、docker只能执行docker所定义的容器。 2、docker缺乏灵活的隔离方案(docker只能运行在Linux主机环境中)。 如果我们从Production和CI层面来比较,那么docker就无法与vagrant相比了:Vagrant没有上面的约束条件,而docker必须依赖它们。 如果你的项目必须使用Docker的容器,同时只能部署在Linux主机中。这个时候Docker的确是一个不错的选择。除此之外,我就看不到使用docker的优势了,相反你还浪费了vagrant很多的优点:
下面两点是我听到docker可以替代vagrant的声音:
所以,我们现在可以得知vagrant和docker是有很大区别的,直接比较这两个是不正确的。对于开发环境来说,vagrant是一种更为抽象,更为通用的解决方案。Docker所能提供的场景只是vagrant所支持的特殊场景之一。 在一些极端案例场景下,docker完全可以替代vagrant。但在更多的场景下,这是错误的。同时vagrant也不会封锁你使用docker。 针对Mitchell的这些解释,Hykes写出了下述的论点: 如果你仅仅是想管理虚拟机,那么你应该使用vagrant。如果你想快速开发和部署应用,那么应该使用docker。 vagrant是一款管理虚拟机的工具,而docker是一款通过将应用打包到轻量级容器,而实现构建和部署的工具。两者适用范围不同。一个容器就是一个包含了应用执行所依赖的数据(包括lib,配置文件等等)。它可以保证应用在一个可重复的环境中随时执行。 有了这个容器,就可以很简单的构建你的容器也可以随时随地的进行部署。 Docker只能在Linux上面执行是一个很大的误区!事实上,Docker可以在MAC和Windows上面安装。如果你在MAC上面安装Docker,那么会有一个大概25MB的精简Linux VM来充当MAC和docker直接的交流者。一旦Docker安装完成后,就可以使用同样的命令进行操作了。这样,世界一下就美好了:你通过轻量级的容器可以更好的测试和开发你的应用,并且很容易的将这些应用进行分发(比如通过 https://index.docker.io)。而你不需要了解如何管理这些虚拟机,而仅仅把虚拟机当做完成事情中的一个环节而已。 理论上,vagrant可以作为docker一个抽象数据层。理由如下:
所以最后可以说:Vagrant 适合用来管理虚拟机,而docker适合用来管理应用环境。 (责任编辑:IT) |