本人曾於硅谷及國內使用以上兩者進行開發、創業。三年來,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. 謝謝!