Vagrant 和 Docker的使用场景和区别? - 知乎


本站和网页 https://www.zhihu.com/question/32324376 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Vagrant 和 Docker的使用场景和区别? - 知乎首页知学堂会员发现等你来答​无障碍登录/注册DockerVagrantVagrant 和 Docker的使用场景和区别?在网上留意到有些团队在工作中用Vagrant来复制或者发布dev/QA环境来保持环境一致, 这个功能和容器docker的作用有些类似, 而且国内doc…显示全部 ​关注者888被浏览205,537关注问题​写回答​邀请回答​好问题 7​1 条评论​分享​15 个回答默认排序大杰哥​无论在硅谷、还是在国内的两次创业,两年来,docker一直陪伴在我左右。​ 关注394 人赞同了该回答本人曾于硅谷及国内使用以上两者进行开发、创业。三年来,docker一直陪伴在我左右。首先,相似之处是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 cpssh: vagrant ssh; docker-compose exec CONTAINER /bin/sh所以,到最后,我们发现,开发部署都用docker还有一个额外好处,vagrant的开发环境到部署环境还是存在差异的,而我们开发用的起docker集群的编排脚本无需经过调试直接复制到服务器端就能一行命令解决部署: docker-compose up -dWhat coded is what will be deployed. 谢谢!编辑于 2017-10-03 21:28​赞同 394​​15 条评论​分享​收藏​喜欢收起​知乎用户107 人赞同了该回答本质区别Vagrant并不提供虚拟化技术,本质上是一个虚拟机外挂,通过虚拟机的管理接口来管理虚拟机,让用户更轻松的进行一些常用配置,比如:CPU/Memory/IP/DISK等分配。并且提供了一些其它的管理操作:比如开机运行指定命令,镜像二次打包,插件编写等等。vagrant官方有介绍To achieve its magic, Vagrant stands on the shoulders of giants. Machines are provisioned on top of VirtualBox, VMware, AWS, or any other provider. Then, industry-standard provisioning tools such as shell scripts, Chef, or Puppet, can be used to automatically install and configure software on the machine.而docker是一个容器引擎,每一个实例是一个相对隔离的空间,与宿主机共享操作系统内核,并且共享宿主机资源。相对于披着虚拟机皮的vagrant,docker更加轻量,消耗更少的资源。贴一张docker官方介绍图关于虚拟机和docker的区别这边文章有更形象的解释:一篇不一样的docker原理解析 - uncle creepy的文章 - 知乎专栏应用场景关于应用场景没有绝对,把两个东西都用熟,自己觉得用哪个方便用哪个好管理就用哪个。vagrant既然vagrant本质是虚拟机外挂,那么它的应用场景就是,节省你用原生虚拟机管理软件的时间。原来我们新增一台虚拟机需要配置好内存、硬盘、CPU等,然后添加iso,安装。创建用户,等等。一套下来好几十分钟是吧?聪明点你可能会想到复制一个创建好的镜像然后粘贴。但这一切vagrant都帮你想好了安装vagrant后你只需要6步就能创建一台新的虚拟机,其中两步是创建文件夹和切换文件夹$ mkdir vagrant_getting_started
$ cd vagrant_getting_started
$ vagrant box add hashicorp/precise32
$ vi Vagrantfile
#添加配置$ vagrant init从安装到创建一台新的虚拟机就成功了。如果你想要再添加一台虚拟机,你只需要执行最后两步,添加一个不同名字的配置就能再新建一台虚拟机。还支持镜像、开机自动运行脚本、插件编写等。dockerdocker主要应用于解决环境依赖以及为应用程序提供一个相对隔离的空间,一个实例像操作系统里运行的一个程序。原来部署一套环境是不是得自己编写自动化部署依赖环境以及程序的脚本?如果有两个依赖同一程序或库的不同版本怎么办?绝对路径?软连接?docker能很好的解决你的烦恼。把需要的依赖环境打包成一个镜像,再把程序放镜像里面运行。总的来说vagrant更适合给开发大爷们创造一个统一的开发、测试、接近于完全隔离的环境,以及提高对高配机的闲置利用。docker更方便地解决了同一机器上的环境隔离,以及提高运维锅们解决部署时环境依赖的效率。编辑于 2016-09-17 21:28​赞同 107​​6 条评论​分享​收藏​喜欢收起​