近年來(lái),Docker在IT界可謂風(fēng)光十足,各大技術(shù)論壇上賺足了眼球,公司內(nèi)外也有相當(dāng)多的介紹和嘗試,看上去如此高大上的技術(shù),貌似會(huì)給云、服務(wù)部署、運(yùn)維等領(lǐng)域帶來(lái)顛覆性的創(chuàng)新。
近期查閱了一些文檔,較深入的了解Docker的技術(shù)細(xì)節(jié),發(fā)現(xiàn)Docker確實(shí)在解決部分需求時(shí)恰到好處,但也絕對(duì)不是無(wú)所不能的萬(wàn)金油。
一、什么是Docker
官方定義:
Develop, Ship and Run Any Application, Anywhere
Docker is a platform for developers and sysadmins to develop, ship, and run applications. Docker lets you quickly assemble applications from components and eliminates the friction that can come when shipping code. Docker lets you get your code tested and deployed into production as fast as possible.
解讀:
官方把Docker定義為應(yīng)用打包、部署的平臺(tái),而不是虛擬化技術(shù);
Docker本身并沒(méi)有革命性的創(chuàng)新,其核心是Container,Container是很多年前就提出來(lái)的理念,并且在Linux、Unix、 FreeBSD上都有技術(shù)實(shí)現(xiàn),Linux成熟的方案是lxc;
Docker是一個(gè)基于lxc(linux container),以及cgroup的上層工具,通過(guò)對(duì)lxc,cgroup及相關(guān)系統(tǒng)命令的封裝,使得用戶可以非常方便的使用Linux Container;
Docker Hub提供了應(yīng)用包的版本管理和分發(fā)能力
二、Docker的價(jià)值及同類技術(shù)對(duì)比
Container的核心價(jià)值在于隔離性和封裝性,在這兩方面也有較多類似解決方案,簡(jiǎn)單分析和對(duì)比一下:
1. 隔離性
Docker的隔離性是通過(guò)Container來(lái)實(shí)現(xiàn)的,并且是基于Lxc;與此相對(duì)應(yīng)的另外一個(gè)解決方案是虛擬化;兩者對(duì)比如下:
優(yōu)點(diǎn):
非常輕量
與創(chuàng)建或啟動(dòng)一個(gè)虛擬機(jī)相比,Container可以認(rèn)為沒(méi)啥開(kāi)銷,約等于Linux下創(chuàng)建一個(gè)進(jìn)程;
有個(gè)夸張的說(shuō)法:?jiǎn)螜C(jī)可以輕易的啟動(dòng)多達(dá)上千個(gè)Container,但基本不太可能啟動(dòng)上千個(gè)虛擬機(jī);
但這比較的前提是需要在單機(jī)上隔離1000個(gè)應(yīng)用;如果只需隔離兩個(gè)應(yīng)用,每個(gè)應(yīng)用運(yùn)行500個(gè)進(jìn)程的話,對(duì)比應(yīng)該是兩個(gè)Container與兩個(gè)VM;
缺點(diǎn):
隔離層次高
docker在Linux kernel之上進(jìn)行隔離,確切的講是進(jìn)程間的隔離,這就決定了:
1)Docker只支持64位Linux,必然不支持windows, unix, bsd...,而虛擬化可支持所有主流操作系統(tǒng);
2)Docker隔離在kernel之上,并且本身依賴于kernel的特性,所以只能模擬出高版本的Linux發(fā)行版;必然找不到ubuntu 9.04這樣的image;
3) Container使用的Kernel與主機(jī)的Kernel是一致的,無(wú)法定制Container的內(nèi)核;
硬件資源度量和配額能力
通過(guò)cgroup,Docker具備一定的能力控制Container的資源使用,但在網(wǎng)絡(luò)、磁盤(pán)、CPU的使用上,度量和隔離能力還沒(méi)有VM成熟;
此外,從用戶角度來(lái)看,VM可以做到非常透明,可以直接理解為一臺(tái)主機(jī);但Container在網(wǎng)絡(luò)連接、數(shù)據(jù)存儲(chǔ)方面都需要經(jīng)過(guò)特殊處理;
所以,與虛擬化相比,從隔離性上看,Docker的優(yōu)勢(shì)在于性能損耗低,劣勢(shì)在于隔離層次比較高;
如果你的需求在是單機(jī)上進(jìn)行盡可能多的隔離,那Docker是首選;
如果你的需求是盡可能徹底的隔離,對(duì)硬件資源精準(zhǔn)控制且可度量,同時(shí)對(duì)隔離份數(shù)要求不多的話,那虛擬化是首選;
2. 封裝性
從Docker的Logo以及官方的定義來(lái)看,它的主要能力并不在隔離性,而在于封裝性,也就是應(yīng)用的打包、部署、運(yùn)行;
在封裝方面的優(yōu)勢(shì),主要體現(xiàn)在:
封裝大小
與VM相比,Docker的image確實(shí)很小,官方的Centos image大概只有220M(被精減成最基本的Centos了,連ifconfig命令都沒(méi)有,安裝完常用工具,你會(huì)發(fā)現(xiàn)也不小了);
可對(duì)應(yīng)用高度定制和封裝
可通過(guò)Dockerfile定義應(yīng)用包,Image內(nèi)的部署可高度定制和封裝,對(duì)外接口收斂且清晰;使用者無(wú)需關(guān)注細(xì)節(jié);
Image倉(cāng)庫(kù)及版本管理
非常成熟的公共和私有倉(cāng)庫(kù)搭建和使用,以及版本管理,并可通地倉(cāng)庫(kù)很容易的進(jìn)行共享、分發(fā)、部署;
應(yīng)用和運(yùn)行分離
我們所看到的Image是靜止的,只讀的;將image運(yùn)行起來(lái)后是Container了,在運(yùn)行時(shí)的修改,只影響當(dāng)前Container,不影響Image;
從上面可以看出,與VM Image的部署能力相比,Docker設(shè)計(jì)理念先進(jìn),優(yōu)勢(shì)明顯,而且?guī)缀鯖](méi)有啥缺點(diǎn)。
但從封裝部署角度來(lái)看,Docker的競(jìng)品應(yīng)該不是VM,而是RPM+YUM,DEB+APT這樣的組合。
你會(huì)發(fā)現(xiàn),與這兩組合相比,能力出奇的相似了,但還是有些區(qū)別:
封裝能力:
Docker的Image,可以輕易實(shí)現(xiàn)在Centos上面跑Ubuntu,而且非常輕量,這個(gè)是Rpm,Deb不具備的;
這個(gè)在一些測(cè)試、學(xué)習(xí)、或小規(guī)模的Paas場(chǎng)景下,是非常有價(jià)值的;
但任何較大規(guī)模的應(yīng)用,我想不太可能出現(xiàn)這樣的部署;
封裝粒度及依賴管理:
Docker自kernel之上,全打包在一塊了,里面包含了Linux用戶環(huán)境、系統(tǒng)類庫(kù)、應(yīng)用程序;可以理解為,一個(gè)Docker Image的外部依賴只有Linux Kernel了;從另外一方面看,極大提升了移植能力;
Rpm、Deb的打包粒度比Docker更細(xì),只打包單個(gè)應(yīng)用自身,外部依賴通過(guò)只記錄并不存儲(chǔ)在包內(nèi),通過(guò)apt,yum這樣的輔助工具也非常容易解決外部依賴;這樣做的好處在于更輕量,理論上包大小肯定小于Docker;在大規(guī)模業(yè)務(wù)部署下,上千臺(tái)設(shè)備發(fā)布20M的RPM,與發(fā)布200M的Docker image,效率上的差距應(yīng)該還是比較大的;
實(shí)際應(yīng)用當(dāng)中,在解決外部依賴問(wèn)題上,C/C++程序還可以簡(jiǎn)單的通過(guò)靜態(tài)鏈接來(lái)實(shí)現(xiàn);Java/PHP/GoLang這類程序基本不存在系統(tǒng)類庫(kù)的依賴,跨平臺(tái)的能力也勝過(guò)Docker本身;
跨平臺(tái):
在各大Linux發(fā)行版下,你都可以按相同的方式使用Docker來(lái)管理打包及部署;但Rpm,Deb都有自己的粉絲和發(fā)行版本,在發(fā)行版間不通用;
但Docker自身的學(xué)習(xí)和部署成本,要高于Rpm,Deb;
所以,從封裝性看,Docker遠(yuǎn)勝于VM,與Rpm+Yum&Deb+Apt能力相當(dāng),從用戶角度來(lái)看是多了一個(gè)選擇;
拋開(kāi)隔離性,假設(shè)你需要在單機(jī)上運(yùn)行一個(gè)MySQL,你是希望安裝Docker、再用Docker來(lái)部署MySQL?還是直接yum install mysql?
綜合來(lái)看,Docker的核心價(jià)值就在于隔離性和封裝性,并在兩者間有個(gè)很好的平衡和兼顧,可預(yù)見(jiàn)的是在小規(guī)模的Paas領(lǐng)域是最好的解決方案。
三、Docker在公司內(nèi)應(yīng)用的思考
前面講到Docker的核心價(jià)值在于隔離性和封裝性,討論Docker在公司內(nèi)業(yè)務(wù)的應(yīng)用也應(yīng)該從這兩個(gè)方面來(lái)看。
哪些場(chǎng)景可以用到隔離性:
研發(fā)測(cè)試流程,單機(jī)多版本并行部署和運(yùn)行;
公司內(nèi)部的類Paas服務(wù),比如TDW計(jì)算、藍(lán)鯨;
海量服務(wù)的正式環(huán)境,基本單個(gè)服務(wù)就能跑滿單機(jī),可以說(shuō)完全沒(méi)有隔離性需求;
哪些場(chǎng)景用到封裝性:
公司所有業(yè)務(wù)都需要打包部署,但各大業(yè)務(wù)都已經(jīng)有非常成熟的包發(fā)布系統(tǒng);整合研發(fā)、編譯、測(cè)試、發(fā)布以及架構(gòu)、配置、路由等各方面的能力;推倒現(xiàn)有包發(fā)布系統(tǒng),基于Docker重構(gòu)的話,開(kāi)發(fā)和用戶學(xué)習(xí)成本相當(dāng)高,但技術(shù)上并沒(méi)有明顯價(jià)值。
如果是全新開(kāi)發(fā)的技術(shù)框架和運(yùn)維體系的話,Docker會(huì)是一個(gè)較好的選擇,但個(gè)人更傾向于Centos+Yum+RPM的組合。
四、其它
IT技術(shù)日新月異,新技術(shù)和組件層出不窮,類似Docker之類的使用勢(shì)必要求基礎(chǔ)運(yùn)營(yíng)環(huán)境與業(yè)界保持同步更新。
為了能保持與業(yè)界同步,技術(shù)團(tuán)隊(duì)仍需花費(fèi)巨大精力投入到無(wú)任何業(yè)務(wù)產(chǎn)出的工作當(dāng)中。