首先,相似之处是Vagrant和Docker都是虚拟化技术。Vagrant是基于Virtualbox的虚拟机来构建你的开发环境,而Docker则是基于LXC(LXC)轻量级容器虚拟技术。全面理解这两种虚拟技术的区别,需要阅读很多文档。我这里打个简单的比方,虚拟机之于容器虚拟技术相当于进程和线程。虚拟机内可以包含很多容器,正如一个进程中可以包含很多线程。虚拟机重,容器虚拟技术轻。前者的Image一般以GB计算,Docker则以100MB为单位计算。
当然,提问者肯定更希望从应用层面来了解两者的区别。简单点讲,Vagrant就是你的开发环境的部署工具;而docker是你的运行环境部署工具。
很多程序员一定会问,为何还需要一个开发环境部署工具呢,我们平时随随便便就把一个WAMP服务器下载安装配置好了,简单方便,开包即用。
问题是,现实的开发环境会比这复杂太多太多。数据库、缓存服务器、反向代理服务器、Load Balancer、搜索引擎服务器(例如Sunspot或Elastic Search)、网站服务器、实时推送服务器。数据库往往还不止一种,为匹配各种架构一般创业公司都会起Mysql或Postgres,与此同时,根据你的业务需求可能还需要添入Nosql或管理时间序列等各类数据库。这么多种不同的服务器,需要被配置并且完美地在一起配合工作,相信任何老司机都知道,不是易事。即使你对每一块都很熟悉,每一次从头配置起,你总会在某些地方栽跟头,即使依照事先做好的部署脚本来做,你还要保障每个软件工具的版本一致,然后脚本运行准确无误。即使真的有老司机熟练到每一次服务器迁移或者服务器扩容,都能准确无误地部署,那还是躲不过一个事实:老司机有一天也会离职,这项精确的部署技能如何得以香火延续?你教得再好,那也只代表你教的,线上运维问题就像打鼹鼠游戏,此处扑灭,彼处着火。
上述实际部署中会遇到的问题,不知道难倒过多少运维老司机,甚至一个小问题、小迁移,就能让他们痛不欲生、彻夜奋战。放假前五分钟能搞定的事,放假后愣是得用五个小时对付。
转而去思考一番,一个非常顺其自然的方法就是把当前的开发环境做个镜像,然后拷到U盘里,这样每一个新员工加入直接对着U盘安装就行(我有朋友的公司就这么干的!)。但这还是解决不了太多太多开发环境的设置问题,如果开发环境更迭了呢?再做一个u盘么?其他人再安装一遍么?
这个时候,vagrant的就出现了,而vagrant的出现显然就是为了解决以下两个重点问题:(1)开发环境快速部署 (2)开发环境更迭。少一个点没解决好,vagrant的存在都是伪需求。
说白了vagrant就是一个普普通通的装了一个Linux的VirtualBox虚拟机,配以vagrant 团队为之开发的一系列套件,辅助完成诸如安装初始化、文件同步、ssh、部署环境升级、功能插件安装等等一些列问题的开发环境部署套件。也没什么好神秘的。
但关键问题是,因为国内没有非常好的vagrant资源提供商,vagrant在国内没法正常使用。至少,我在国内一共尝试了三次,三次的结果我都是觉得vagrant没法给我周边的程序员增加生产力。手游买卖原因我已经说了,如果你硬要尝试着玩玩,我建议你先准备好一个国内最好最稳定最快速的网络加速器(俗称FQ),然后在vagrant up、vagrant provision以及其他vagrant需要安装*资源前把proxy代理先设置好。否则....那得慢出翔来!!! 这是我觉得最不能忍的地方!!!为了装个比体验下硅谷最先进的开发环境部署工具,我tm死死地盯着屏幕vagrant up长达一个小时,还随时有可能断线导致整个过程重来。你知道,我现在想来都是一肚子火!!
DOCKER,我给了它一个大写。它的情况就完全完全不一样了!!
首先,简单地说,Docker就是在内核容器技术(Cgroup和Namespace)的基础上,提供了一个更高层的控制工具,该工具包含一下特性:(1)跨主机部署(2)以应用为中心 (3)自动构建 (4)版本管理 (5)组建重用 (6)共享 (7)工具生态链。 《Docker 进阶与实战》Page.8 By 华为Docker实践小组。
By the way, 国内Docker哪家强? 别胡扯了,技术上,第一绝壁是华为!去Docker的github主页上翻翻它的前200的contributors,看看有多少华为的。技术上是华为,但从生态上,我觉得最强的是阿里,阿里一家就把代码托管、docker持续集成部署以及虚拟主机三块业务全部做了,而且三者都非常好用。仅docker持续集成部署这一项,我觉得就已经完爆我用过的所有的docker服务了,这里我就不一一列举,很多都是业内朋友,难免误伤。而且阿里很有钱,他们可以任性免费到底。所以docker选哪家?我呢,也是docker使用老司机了,从硅谷工作、我的第一个创业项目、第二个创业项目,通通都是docker部署的,我现在使用的是阿里容器服务: https://cs.console.aliyun.com ,配合阿里的虚拟主机以及代码托管(code.aliyun.com),实在不能再方便。
创业圈的docker服务,我比较推荐http://daocloud.io,很久以前我还去他们家上海总部做过使用开发demo,这是一家很有工程师文化的企业,而且里面确实有好几个国内docker界*玩家。
话说到此,docker之所以在国内能流行起来,是因为docker在国内有强大的群众基础;而这个群众基础的建立是多方面原因的,例如:docker的管理高层也多次来华参加活动,助力docker;无数个docker服务商在做着各种各样的docker底层设施工作。可是归根结底,docker之所以会受到如此追捧,是因为docker是一门真正意义上的具有革命性和划时代意义的普惠技术,而vagrant不是。docker可以帮助你实现秒级部署、分钟级服务器栈迁移。这是历史上还从来没有发生过的事。
那针对国内可以流畅使用docker但无法正常使用vagrant的情况,作如何处理呢?
我们团队的解决方案是将服务器部署的docker编排脚本(docker-compose)直接修改参数以适应Local开发。每次开发前,docker-compose up -d,再配以各类脚本。结果是,这样开发起来比在硅谷用Vagrant还要爽!!Vagrant所有的操作都可以用在docker中一样做,例如:
复制文件: vagrant scp; docker cp
ssh: vagrant ssh; docker-compose exec CONTAINER /bin/sh
所以,到最后,我们发现,开发部署都用docker还有一个额外好处,vagrant的开发环境到部署环境还是存在差异的,而我们开发用的起docker集群的编排脚本无需经过调试直接复制到服务器端就能一行命令解决部署:
docker-compose up -d