如下内容均出自Vagrant做者(Mitchell Hashimoto)与Docker做者(Solomon Hykes)在stackoverflow上面一个问题讨论。在这个问题中,双方阐述了vagrant和docker的特色和使用范围,对于深刻理解vagrant和docker颇有意义,所以笔者翻译出来,以供你们讨论学习。html
Mitchell做为vagrant的做者,其在DevOps的世界里面沉浸多年,接触了不少相似docker的虚拟化软件。他目前接触了不少使用vagrant和docker的场景,因此看到了二者是如何相互搭配发生做用的。linux
他认为若是单单是开发人员一我的单独使用主机,使用docker能够简化不少事情,这种场景下使用docker和vagrant都没有什么区别。因此他更多的讨论了一些复杂场景,在这些复杂场景中,docker和vagrant就有一些区别了。docker
如下是他原文:windows
不分场景而直接比对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。less
好比在vagrant V1.6版本中,vagrant集成了docker-based development environments,所以Vagrant能够在windows,mac和linux上面提供docker服务。ssh
vagrant没有想替代docker的想法,相反它还包含了docker的一些特性。ide
若是咱们从逻辑层面来比较vagrant和docker的话,那么:工具
一、docker只能执行docker所定义的容器。学习
二、docker缺少灵活的隔离方案(docker只能运行在Linux主机环境中)。
若是咱们从Production和CI层面来比较,那么docker就没法与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。
vagrant能够更好的配置网络和文件共享。好比:vagrant能够给一个VM配置静态IP和端口数据转发。不论你使用的VirtualBox仍是VMware,vagrant均可以很好的完成配置。对于文件共享来讲,vagrant提供了多种文件挂载方案供你考虑。若是你使用了docker,那么这些事情就都须要你亲自动手来作了。
vagrant 1.6中集成了docker-based development environments。因此在MAC和Windows环境中,vagrant会自动启动一个虚拟机来执行docker,这样就达到了docker的跨平台化。而背后例如网络,文件等等操做都是vagrant默默完成的。
下面两点是我听到docker能够替代vagrant的声音:
"Docker须要移动的数据不多"的确,Docker有这个特色(应该指的是Docker采用的UFS,致使docker每次变更所需的数据不多--笔者猜想)。可是当你在每一个项目都使用docker,或者在每一个项目的如今,未来都使用docker时,你就会发现docker所产生的数据并很多。而若是你使用vagrant,那么只须要移动一次就能够完成。(原文:"It is less moving parts" - Yes, it can be, if you use Docker exclusively for every project. Even then, it is sacrificing flexibility for Docker lock-in. If you ever decide to not use Docker for any project, past, present, or future, then you'll have more moving parts. If you had used Vagrant, you have that one moving part that supports the rest).
"Docker启动很是快",当使用docker启动容器时,它比其余虚拟机启动的都快。可是我要说的是,目前从产品化角度分析全部vagrant主机基本都是启动一次,而后再也不停机。若是从快速部署开发环境来讲,docker这个特性真的是很是好。
因此,咱们如今能够得知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更好的抽象。vagrant设计使用来管理虚拟机的,而docker设计是用来管理应用的。这就意味着docker在设计之初就是为了能够经过多种方式来相互组合应用。在docker中processes, log streams, environment variables ,network links between components是最底层的原型。在vagrant中machines, block devices, and ssh keys是最底层的原型。vagrant工做在系统底层,它同另一个vagrant容器交互的方式只有把它当作一个能够"boot"和"log into"的机器。所以,你能够在docker上面安装插件后,执行"vagrant up"命令后等待美好的事情发生。
其次,可锁定的环境参数(the lock-in argument)。""If you use Vagrant as an abstraction, you will not be locked into Docker!"站在管理虚拟机的vagrant角度上面看,这句说没有错:Docker不是另一个独立的容器。像EC2和VMware同样,咱们要避免创造一个和其它工具相捆绑的东西。Docker对宿主机没有任何要求,它容许你经过轻量级的容器在任意地方进行部署。在你部署应用时,不须要考虑应该部署到什么环境中。好比说:你能够在其余人提供的主机(极可能上面已经部署了EC2或者vagrant)上面部署应用。
因此最后能够说:Vagrant 适合用来管理虚拟机,而docker适合用来管理应用环境。
若是您认为此文章对您有所帮助,请您点击推荐。进步来源于思想的碰撞,因此欢迎你们踊跃留言评论。