標籤:

VAGRANT 和 Docker的使用場景和區別?

在網上留意到有些團隊在工作中用Vagrant來複制或者發布dev/QA環境來保持環境一致, 這個功能和容器docker的作用有些類似, 而且國內docker最近也非常流行,很多公司也在使用。 不知道有沒有人在工作中把Vagrant和docker結合起來用的,或者說明一下它們的優缺點和對應的使用場景? 謝謝。


本人曾於矽谷及國內使用以上兩者進行開發、創業。三年來,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 cp
  • ssh: vagrant ssh; docker-compose exec CONTAINER /bin/sh

所以,到最後,我們發現,開發部署都用docker還有一個額外好處,vagrant的開發環境到部署環境還是存在差異的,而我們開發用的起docker集群的編排腳本無需經過調試直接複製到伺服器端就能一行命令解決部署:

docker-compose up -d

What coded is what will be deployed. 謝謝!


本質區別

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

從安裝到創建一台新的虛擬機就成功了。如果你想要再添加一台虛擬機,你只需要執行最後兩步,添加一個不同名字的配置就能再新建一台虛擬機。還支持鏡像、開機自動運行腳本、插件編寫等。

docker

docker主要應用於解決環境依賴以及為應用程序提供一個相對隔離的空間,一個實例像操作系統里運行的一個程序。

原來部署一套環境是不是得自己編寫自動化部署依賴環境以及程序的腳本?如果有兩個依賴同一程序或庫的不同版本怎麼辦?絕對路徑?軟連接?

docker能很好的解決你的煩惱。把需要的依賴環境打包成一個鏡像,再把程序放鏡像裡面運行。

總的來說

vagrant更適合給開發大爺們創造一個統一的開發、測試、接近於完全隔離的環境,以及提高對高配機的閑置利用。

docker更方便地解決了同一機器上的環境隔離,以及提高運維鍋們解決部署時環境依賴的效率。


Vagrant: dev -&> QA

Docker: CI/CD-&> deploy


Vagrant是對傳統虛擬機的一層封裝,能讓你更方便的使用虛擬機,主要解決的問題是開發和運維人員的環境配置問題;Docker是基於容器技術的新一代虛擬化技術,其解決的是開發,測試和運維一整套流程相關的問題。兩者解決的問題有些相像,但是解決的方案不是在一個層次上的。


樓主的提問是不對的,你應該問docker和vm的區別,或者問vagrant和docker-compose的區別,而docker是虛擬化技術,而vagrant只是vm編排工具


docker是針對服務的,也就是service

vagrant就是虛擬機。


Docker與Vagrant的區別,我們什麼時候該用誰?:

http://dockone.io/article/271


其實,真有人會在生產環境使用vagrant嗎?還必須配合virtualbox或者vmplay虛擬機才能使用。在生產環境裝這些軟體不會被項目經理打死嗎?

我還以為vagrant只能應用於本地開發環境的搭建。為了統一團隊間的開發環境。


vagrant是用來更好的管理你的虛擬機的

而docker是通過將應用打包到輕量級容器,而實現構建和部署的工具,更加輕量級。


我現在基本上都是使用Docker進行構建編譯,只要做好一個包含所有需要的依賴的docker鏡像,然後把代碼掛上去就能直接編譯了。參考的一個用例是Hadoop的編譯,就是把所有依賴放在一個docker容器裡面,然後進行構建的。

一般測試一些分散式的應用,基本上就使用Vagrant了,配置好環境,vagrant up就行了。比如使用Cloudera Manager就是用這個方法的。


在未來,Go語言能否撼動Java在Android、Hadoop大數據、雲計算領域的地位? - 王益的回答 剛好回答了這個問題


主要是用筆記本的ssd硬碟太小,只能用docker...


你可以在 Vagrant 裡面使用 Docker(Windows 和 OS X 下經常這樣)。

也可以在 Docker 裡面使用 Vagrant(僅 Linux 可用)。


推薦閱讀:

Docker 有什麼優勢?
在雲環境中的應用部署方式上,Docker會不會取代KVM、Xen之類的虛擬機技術?
docker在web開發中得使用流程是怎樣的?
DaoCloud是一家什麼樣的公司?
Docker 的應用場景在哪裡?

TAG:Docker | Vagrant |