Docker,容器,虛擬機(jī)和紅燒肉
最有意思的事情是,在docker本身還沒有穩(wěn)定之前,就有如RedHat和AWS這樣的公司為其提供官方支持,很多開發(fā)者和公司就急不可耐的把它用到生產(chǎn)環(huán)境,連docker自己的CEO都要跳出來勸說大家稍安勿躁,我們還沒有準(zhǔn)備好嘞。在整個IT軟件發(fā)展歷史中,好像很少有這種情況,特別是這種企業(yè)級運(yùn)維相關(guān)的系統(tǒng),一般大家都是慎之又慎,為何這次如此不謹(jǐn)慎,如此不認(rèn)真,如此不負(fù)責(zé)任把還在beta階段的系統(tǒng)上線運(yùn)行?
我記得2014年8月,這時距離docker發(fā)布僅僅1年的時間,我與湖南某家大型媒體的研發(fā)中心交流,開發(fā)人員已經(jīng)在使用docker運(yùn)行他們的系統(tǒng),而且有些已經(jīng)進(jìn)入生產(chǎn)環(huán)境。而在過去的2年里,每一個我所接觸的客戶,從C-level的管理人員,到中層管理者,到開發(fā)人員都在提這個東西。
它到底是什么?這可能是每一個IT從業(yè)者都想搞明白的問題。
Docker是什么?容器又是什么?
Docker 直譯:碼頭工人。是在碼頭上搬運(yùn)貨物的工人
容器 英文:Container,如果再翻譯回來就有2個不同的釋義:集裝箱/容器。
如果按照這世界上大多數(shù)正常人的理解,大家會把 Docker(碼頭工人)和 Container (集裝箱)這一對事物放在一起,他們的關(guān)系一目了然:碼頭工人搬運(yùn)集裝箱。但是如果按照這世界上另外的一類人(程序員)的理解,我們會這樣組合 ,Docker (代碼集裝箱搬運(yùn)工)和 Container (容器)。
Docker與容器是完全2個不同的東西,Docker是用來組裝/搬運(yùn)/拆包容器的工具。當(dāng)然也可以是人,我們原來這些苦逼的程序員誰沒干過zip/copy/paste/unzip的工作呢?其實(shí)Docker就是這樣一個工具,用來打包 (build)/傳送(push/pull)/拆包 (run) 那些需要運(yùn)行的應(yīng)用。而容器就是那個包。
那么容器又是什么?
其實(shí)和集裝箱很類似,就是把那些需要放在一起從A地運(yùn)送到B地運(yùn)行的,不能和其他程序混雜的代碼封裝成的一個包而已。這個概念從計算機(jī)出現(xiàn)的那天基本上就存在了,只是這么多年我們一直在不停的改進(jìn),但從來沒有一個像docker這樣的工具讓容器的使用變的如此簡單。在Unix/Linux的世界里,它曾將叫做 Process Container,現(xiàn)在被稱為Control Group (cGroup);在Windows世界里,我們曾經(jīng)有組件。他們的目的都一樣,為了把程序從A地運(yùn)送到B地,同時確保他們可以相互隔離的運(yùn)行。
Docker絕對不等同于容器。一個是干活的人,一個是被搬運(yùn)的物品,能一樣嗎?但是我仍然在各種技術(shù)文章,會議演講上看到和聽到將他們混為一談的說法。實(shí)在覺得需要給他們正名,也是今天寫這個文章的主要原因。
Docker,容器與虛擬機(jī)有啥區(qū)別?
在每一篇介紹Docker的文章里面都會看到與虛擬機(jī)比較的內(nèi)容,其實(shí)我覺得這完全是拿蘋果和香蕉比較,它們完全不具備可比性,至少在技術(shù)上!
大家為啥要這樣比較,主要目的是讓那些不了解IT但是卻在管理IT的人(對,就是你的領(lǐng)導(dǎo)和你的客戶)理解為啥他們好不容易,花了n多錢建立起了虛擬化平臺/私有云,現(xiàn)在還要再花錢搞容器,搞docker。對的,這純粹是個市場行為,與技術(shù)無關(guān),因?yàn)樗麄冊诩夹g(shù)上不具備可比性。
慣常的說法,容器啟動迅速(對,它只需要加載那些當(dāng)前應(yīng)用的進(jìn)程)虛擬機(jī)啟動緩慢(廢話,它要加載一堆和應(yīng)用無關(guān)的進(jìn)程好嗎)。你試試把100個應(yīng)用打包到一個容器里面然后啟動它,估計你一定會被98%的Windows用戶打敗。
給你一個hyper-v, vmware, kvm你跑不了容器,你還是需要在上面啟動虛擬機(jī),然后才能運(yùn)行容器。就好像你要在家里提供100個品類的菜單,然后讓你兒子每天回來點(diǎn)餐,給他個沙漏,然后說你隨便點(diǎn),我保證在10分鐘內(nèi)上菜。你當(dāng)你是謝霆鋒呢?人家謝大廚后面有10個幫廚,10個采購,10個餐廳經(jīng)理,10個服務(wù)員,做的菜都是提前腌制的。你就算有三頭六臂也只能說:臣妾做不到啊!
所以,容器之所以快,是把每次都要啟動操作系統(tǒng)的操作預(yù)先完成了,這樣只需要啟動應(yīng)用本身而已。而且,容器不會比直接啟動一個應(yīng)用快,甚至還會更慢一點(diǎn)。
然并卵,那我要這七十二變有何用?
牢騷發(fā)夠了,還是說說Docker到底有啥用?Docker這個搬運(yùn)工與其他搬運(yùn)工不同的是,他在組裝容器的時候會把應(yīng)用需要的其他配件都放在一個集裝箱里。這樣,集裝箱到貨以后,直接開包就可以完成應(yīng)用組裝;不用再到其他地方七拼八湊的去找各種配件了。這就好比你想做紅燒肉,原來的應(yīng)用打包只給你打包了肉(應(yīng)用),別的什么八角,香葉,冰糖,生抽老抽(應(yīng)用依賴環(huán)境)都不帶;現(xiàn)在商家提供一站式服務(wù),一個包里不光有肉,還有七七八八所有的東西。你家里有爐子,有鍋就夠了(操作系統(tǒng))。
另外,Docker厲害的地方在于,它不光提供了這些配料,還把物流給你搞定了。我們現(xiàn)在可以直接向商家(Docker Hub)下單,商家送貨上門(Docker Pull),你準(zhǔn)備好爐子和鍋(操作系統(tǒng)),直接下鍋(Docker Run),菜就上桌嘍。
最后,用一句話定義Docker,那就是:優(yōu)化應(yīng)用運(yùn)維過程的工具和生態(tài)系統(tǒng)。
【本文為51CTO專欄作者“徐磊”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號devopshub獲取授權(quán)】