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