Docker的價(jià)值和應(yīng)用場(chǎng)景分析
近年來,Docker在IT界可謂風(fēng)光十足,各大技術(shù)論壇上賺足了眼球,公司內(nèi)外也有相當(dāng)多的介紹和嘗試,看上去如此高大上的技術(shù),貌似會(huì)給云、服務(wù)部署、運(yùn)維等領(lǐng)域帶來顛覆性的創(chuàng)新。
近期查閱了一些文檔,較深入的了解Docker的技術(shù)細(xì)節(jié),發(fā)現(xiàn)Docker確實(shí)在解決部分需求時(shí)恰到好處,但也絕對(duì)不是無所不能的萬金油。
一、什么是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本身并沒有革命性的創(chuàng)新,其核心是Container,Container是很多年前就提出來的理念,并且在Linux、Unix、 FreeBSD上都有技術(shù)實(shí)現(xiàn),Linux成熟的方案是lxc;
- Docker是一個(gè)基于lxc(linux container),以及cgroup的上層工具,通過對(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的隔離性是通過Container來實(shí)現(xiàn)的,并且是基于Lxc;與此相對(duì)應(yīng)的另外一個(gè)解決方案是虛擬化;兩者對(duì)比如下:
優(yōu)點(diǎn):
非常輕量
與創(chuàng)建或啟動(dòng)一個(gè)虛擬機(jī)相比,Container可以認(rèn)為沒啥開銷,約等于Linux下創(chuàng)建一個(gè)進(jìn)程;
有個(gè)夸張的說法:?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是一致的,無法定制Container的內(nèi)核;
硬件資源度量和配額能力
通過cgroup,Docker具備一定的能力控制Container的資源使用,但在網(wǎng)絡(luò)、磁盤、CPU的使用上,度量和隔離能力還沒有VM成熟;
此外,從用戶角度來看,VM可以做到非常透明,可以直接理解為一臺(tái)主機(jī);但Container在網(wǎng)絡(luò)連接、數(shù)據(jù)存儲(chǔ)方面都需要經(jīng)過特殊處理;
所以,與虛擬化相比,從隔離性上看,Docker的優(yōu)勢(shì)在于性能損耗低,劣勢(shì)在于隔離層次比較高;
如果你的需求在是單機(jī)上進(jìn)行盡可能多的隔離,那Docker是首選;
如果你的需求是盡可能徹底的隔離,對(duì)硬件資源精準(zhǔn)控制且可度量,同時(shí)對(duì)隔離份數(shù)要求不多的話,那虛擬化是首選;
2. 封裝性
從Docker的Logo以及官方的定義來看,它的主要能力并不在隔離性,而在于封裝性,也就是應(yīng)用的打包、部署、運(yùn)行;
在封裝方面的優(yōu)勢(shì),主要體現(xiàn)在:
封裝大小
與VM相比,Docker的image確實(shí)很小,官方的Centos image大概只有220M(被精減成最基本的Centos了,連ifconfig命令都沒有,安裝完常用工具,你會(huì)發(fā)現(xiàn)也不小了);
可對(duì)應(yīng)用高度定制和封裝
可通過Dockerfile定義應(yīng)用包,Image內(nèi)的部署可高度定制和封裝,對(duì)外接口收斂且清晰;使用者無需關(guān)注細(xì)節(jié);
Image倉庫及版本管理
非常成熟的公共和私有倉庫搭建和使用,以及版本管理,并可通地倉庫很容易的進(jìn)行共享、分發(fā)、部署;
應(yīng)用和運(yùn)行分離
我們所看到的Image是靜止的,只讀的;將image運(yùn)行起來后是Container了,在運(yùn)行時(shí)的修改,只影響當(dāng)前Container,不影響Image;
從上面可以看出,與VM Image的部署能力相比,Docker設(shè)計(jì)理念先進(jìn),優(yōu)勢(shì)明顯,而且?guī)缀鯖]有啥缺點(diǎn)。
但從封裝部署角度來看,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)類庫、應(yīng)用程序;可以理解為,一個(gè)Docker Image的外部依賴只有Linux Kernel了;從另外一方面看,極大提升了移植能力;
Rpm、Deb的打包粒度比Docker更細(xì),只打包單個(gè)應(yīng)用自身,外部依賴通過只記錄并不存儲(chǔ)在包內(nèi),通過apt,yum這樣的輔助工具也非常容易解決外部依賴;這樣做的好處在于更輕量,理論上包大小肯定小于Docker;在大規(guī)模業(yè)務(wù)部署下,上千臺(tái)設(shè)備發(fā)布20M的RPM,與發(fā)布200M的Docker image,效率上的差距應(yīng)該還是比較大的;
實(shí)際應(yīng)用當(dāng)中,在解決外部依賴問題上,C/C++程序還可以簡(jiǎn)單的通過靜態(tài)鏈接來實(shí)現(xiàn);Java/PHP/GoLang這類程序基本不存在系統(tǒng)類庫的依賴,跨平臺(tái)的能力也勝過Docker本身;
跨平臺(tái):
在各大Linux發(fā)行版下,你都可以按相同的方式使用Docker來管理打包及部署;但Rpm,Deb都有自己的粉絲和發(fā)行版本,在發(fā)行版間不通用;
但Docker自身的學(xué)習(xí)和部署成本,要高于Rpm,Deb;
所以,從封裝性看,Docker遠(yuǎn)勝于VM,與Rpm+Yum&Deb+Apt能力相當(dāng),從用戶角度來看是多了一個(gè)選擇;
拋開隔離性,假設(shè)你需要在單機(jī)上運(yùn)行一個(gè)MySQL,你是希望安裝Docker、再用Docker來部署MySQL?還是直接yum install mysql?
綜合來看,Docker的核心價(jià)值就在于隔離性和封裝性,并在兩者間有個(gè)很好的平衡和兼顧,可預(yù)見的是在小規(guī)模的Paas領(lǐng)域是最好的解決方案。
三、Docker在公司內(nèi)應(yīng)用的思考
前面講到Docker的核心價(jià)值在于隔離性和封裝性,討論Docker在公司內(nèi)業(yè)務(wù)的應(yīng)用也應(yīng)該從這兩個(gè)方面來看。
哪些場(chǎng)景可以用到隔離性:
- 研發(fā)測(cè)試流程,單機(jī)多版本并行部署和運(yùn)行;
- 公司內(nèi)部的類Paas服務(wù),比如TDW計(jì)算、藍(lán)鯨;
- 海量服務(wù)的正式環(huán)境,基本單個(gè)服務(wù)就能跑滿單機(jī),可以說完全沒有隔離性需求;
哪些場(chǎng)景用到封裝性:
- 公司所有業(yè)務(wù)都需要打包部署,但各大業(yè)務(wù)都已經(jīng)有非常成熟的包發(fā)布系統(tǒng);整合研發(fā)、編譯、測(cè)試、發(fā)布以及架構(gòu)、配置、路由等各方面的能力;推倒現(xiàn)有包發(fā)布系統(tǒng),基于Docker重構(gòu)的話,開發(fā)和用戶學(xué)習(xí)成本相當(dāng)高,但技術(shù)上并沒有明顯價(jià)值。
- 如果是全新開發(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)巨大精力投入到無任何業(yè)務(wù)產(chǎn)出的工作當(dāng)中。
新技能get√,好工具快get√,趕快轉(zhuǎn)發(fā),讓更多小伙伴知道~