首先,相似之處是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