Docker簡(jiǎn)介
Docker是2013發(fā)起的一個(gè)項(xiàng)目撮弧,早在2013年冠跷,Docker自誕生起,就是整個(gè)技術(shù)界的明星項(xiàng)目勋篓,當(dāng)時(shí)我還在上海實(shí)習(xí)狮暑,就在各種技術(shù)媒體上看到了Docker的介紹文章,很多技術(shù)媒體宣稱docker是一項(xiàng)技術(shù)突破廊勃,并且是一次技術(shù)革命懈贺,可惜當(dāng)時(shí)由于本身是一個(gè)Android Framework開發(fā)者,眼界很低,對(duì)于這種OS虛擬化技術(shù)有點(diǎn)不屑一顧隅居,而今轉(zhuǎn)后臺(tái)后才發(fā)現(xiàn)這項(xiàng)技術(shù)的重要性
Docker的特征
Docker是一個(gè)云開源項(xiàng)目钠至,托管在github,任何人都可以通過(guò) git clone 或者fork參與進(jìn)來(lái)胎源,本身是基于linux的容器技術(shù)棉钧,采用當(dāng)時(shí)如日中天google新推出的Go語(yǔ)言實(shí)現(xiàn)。采用apache 2.0協(xié)議開源涕蚤。
docker鏡像地址
Go語(yǔ)言與Docker
相比Go語(yǔ)言與其它語(yǔ)言的對(duì)比宪卿,國(guó)內(nèi)外很多技術(shù)媒體都有列舉,在Docker領(lǐng)域万栅,Go語(yǔ)言相比其它語(yǔ)言的優(yōu)勢(shì)在于
相對(duì)于C/C 開發(fā)難度低佑钾,支持向前兼容,運(yùn)維維護(hù)成本小
相對(duì)于python烦粒,生成的是靜態(tài)文件休溶,有效的避免的低級(jí)錯(cuò)誤,并且性能高一個(gè)等級(jí)
并發(fā)性好扰她,內(nèi)存占用低
部署簡(jiǎn)單兽掰,畢竟生成的靜態(tài)文件,有g(shù)libc的地方就能運(yùn)行
一門語(yǔ)言當(dāng)然也有自己的缺點(diǎn)徒役,比如孽尽,內(nèi)存回收延遲久,圖片處理庫(kù)有bug忧勿,對(duì)包版本要求嚴(yán)格等一些問(wèn)題杉女,但是瑕不掩瑜,一個(gè)開發(fā)成本極其簡(jiǎn)單鸳吸,性能優(yōu)良熏挎,部署簡(jiǎn)單的語(yǔ)言與Docker簡(jiǎn)直就是 天作之合
至于Go語(yǔ)言的優(yōu)勢(shì),在Go的社區(qū)中都有非常詳盡的討論晌砾,這里不多講
Docker的目標(biāo)
Docker的是一個(gè)輕量級(jí)的操作系統(tǒng)虛擬化解決方案坎拐。 主要目標(biāo),用官網(wǎng)的概括來(lái)說(shuō)就是“Build贡羔,Ship and Run Any App,Anywhere”:編譯廉白,裝載任何App,在任何地方都可以運(yùn)行个初,我們大概理解就是一個(gè)容器乖寒,實(shí)現(xiàn)了對(duì)應(yīng)用的封裝,部署院溺,運(yùn)行等生命周期管理楣嘁,只要在glibc的環(huán)境下,到處都可以運(yùn)行。
這點(diǎn)在企業(yè)的云服務(wù)部署是有非常廣泛的應(yīng)用前景逐虚。后面我們將詳細(xì)討論聋溜。
Docker的引擎
Docker的是基于Linux自帶的(Linux。 Containers,LXC)技術(shù)叭爱,在LXC上撮躁,Docker進(jìn)行了近一步封裝。正因?yàn)槿绱寺蛭恚珼ocker只能在Linux環(huán)境下運(yùn)行把曼,當(dāng)然,前段時(shí)間docker終于支持OSX和Windows了漓穿,雖然還是體驗(yàn)嘗鮮版嗤军,但更加方便開發(fā)者去開發(fā)了!
Docker的原理
其實(shí)前面講了這么多晃危,Docker的原理已經(jīng)不言而喻叙赚,這里用IBM的解釋就是
容器有效的將單個(gè)操作系統(tǒng)管理的資源劃分到孤立的組中,以便更好的在孤立的組之間平衡有沖突的資源使用需求僚饭。與虛擬化相比震叮,這樣既不需要指令級(jí)模擬,也不需要即時(shí)編譯浪慌。容器可以在核心CPU本地運(yùn)行指令冤荆,而不需要任何專門的解釋機(jī)制。此外权纤,也避免了準(zhǔn)虛擬化(paravirtualization)和系統(tǒng)調(diào)用替換中的復(fù)雜性钓简。
簡(jiǎn)而言之就是,Docker是一個(gè)盒子汹想,一個(gè)盒子裝一個(gè)玩具外邓,無(wú)論你丟在哪里,你給他通電(glibc)古掏,他就能運(yùn)行损话。你的玩具大就用大盒子,小玩具就用小盒子槽唾。
兩個(gè)應(yīng)用之間的環(huán)境是環(huán)境是完全隔離的丧枪,建立通信機(jī)制來(lái)互相調(diào)用。容器的創(chuàng)建和停止都十分快速(秒級(jí))庞萍,容器自身對(duì)資源的需求十分有限拧烦,遠(yuǎn)比虛擬機(jī)本身占用的資源少。
Docker VS VM
Docker與虛擬機(jī)(虛擬機(jī))的區(qū)別可以看:
1.jpg
左圖是虛擬機(jī)的工作原理圖钝计,對(duì)資源進(jìn)行抽象恋博,著重體現(xiàn)在硬件層面的虛擬化上齐佳,這種方式增加了兩場(chǎng)調(diào)用鏈,對(duì)性能的損耗比較大债沮,而且還會(huì)占用大量的內(nèi)存資源
有圖是Docker的工作原理圖炼吴,屬于OS級(jí)別的虛擬化,kernel通過(guò)創(chuàng)建多個(gè)鏡像來(lái)隔離不同的app進(jìn)程疫衩,由于kernel是是共享硅蹦,而且本身linux image也不大,性能損耗幾乎可以不計(jì)闷煤,而且內(nèi)存占用也不大提针,大大節(jié)約了設(shè)備成本。
Docker架構(gòu)總覽
2.png
最核心的是 Docker Daemon我們稱之為Docker守護(hù)進(jìn)程曹傀,也就是Server端辐脖,Server端可以部署在遠(yuǎn)程,也可以部署在本地皆愉,因?yàn)镾erver端與客戶端(Docker Client)是通過(guò)Rest API進(jìn)行通信嗜价。
docker CLI 實(shí)現(xiàn)容器和鏡像的管理,為用戶提供統(tǒng)一的操作界面,這個(gè) 客戶端提供一個(gè)只讀的鏡像幕庐,然后通過(guò)鏡像可以創(chuàng)建一個(gè)或者多個(gè)容器(container)久锥,這些容器可以只是一個(gè)RFS(Root File System),也可以是一個(gè)包含了用戶應(yīng)用的RFS。容器在docker Client中只是一個(gè)進(jìn)程异剥,兩個(gè)進(jìn)程是互不可見(jiàn)的瑟由。
用戶不能與server直接交互,但可以通過(guò)與容器這個(gè)橋梁來(lái)交互冤寿,由于是操作系統(tǒng)級(jí)別的虛擬技術(shù)歹苦,中間的損耗幾乎可以不計(jì)
注:
CLI:command line interface。命令行接口.
RFS:Root File System 根文件系統(tǒng).
Image & Container
在docker中督怜,我們重點(diǎn)關(guān)注的就是鏡像和容器了殴瘦。因?yàn)樵趯?shí)際應(yīng)用中,我們封裝好鏡像号杠,然后通過(guò)鏡像來(lái)創(chuàng)建容器蚪腋,在容器運(yùn)行我們的應(yīng)用就好了。而server端掌控網(wǎng)絡(luò)和磁盤姨蟋,我們不用去關(guān)心屉凯,啟動(dòng)docker sever 和 docker client都是一條命令的事情。后面會(huì)詳細(xì)講docker的啟動(dòng)過(guò)程眼溶。
Image: 一個(gè)只讀的鏡像模板悠砚。可以自己創(chuàng)建一個(gè)鏡像也可以從網(wǎng)站上下載鏡像供自己使用偷仿。鏡像包含了一個(gè)RFS.一個(gè)鏡像可以創(chuàng)建很多容器哩簿。
Container:由docker client通過(guò)鏡像創(chuàng)建的實(shí)例,用戶在容器中運(yùn)行應(yīng)用酝静,一旦創(chuàng)建后就可以看做是一個(gè)簡(jiǎn)單的RFS节榜,每個(gè)應(yīng)用運(yùn)行在隔離的容器中,享用獨(dú)自的權(quán)限别智,用戶宗苍,網(wǎng)絡(luò)。確保安全與互相干擾
兩者在創(chuàng)建后薄榛,都是一堆layer的統(tǒng)一視角讳窟,唯一的卻別是鏡像最上面那一層是只讀的,不可以修改敞恋,但是容器最上面一層是rw的丽啡,提供給用戶操作
repository:倉(cāng)庫(kù),這個(gè)東西沒(méi)有單獨(dú)介紹不是因?yàn)樗恢匾裁ǎ且驗(yàn)橹白鰝€(gè)比較多的Android源碼編譯补箍,所以這里就沒(méi)有仔細(xì)往下看,大概就是一個(gè)鏡像庫(kù)啸蜜,最大的是docker hub坑雅,類似于google 的aosp,當(dāng)然也可以本地搭衬横,比如mig事業(yè)群就有自己的repo裹粤。
Docker的應(yīng)用
最后,這里講一下docker的應(yīng)用作為本文的終結(jié)蜂林。
A:為什么會(huì)想起來(lái)學(xué)習(xí)docker技術(shù)
2016年年中的時(shí)候遥诉,我轉(zhuǎn)做后臺(tái),經(jīng)歷了一段時(shí)間的時(shí)候痛苦轉(zhuǎn)型后噪叙,中學(xué)摸到了門檻突那,年底趕上事業(yè)群的服務(wù)器docker化,那段時(shí)間非常痛苦构眯,因?yàn)橄鄬?duì)實(shí)體機(jī)或者虛擬機(jī)愕难,各種問(wèn)題頻出,因?yàn)樘摂M機(jī)或者實(shí)體機(jī)是不會(huì)遷移的惫霸,我們部署一套服務(wù)后會(huì)有一些依賴庫(kù)需要安裝猫缭,但是那段時(shí)間docker經(jīng)常遷移,之前也沒(méi)有接觸過(guò)docker壹店,導(dǎo)致問(wèn)題頻出猜丹。
到2017年4月的時(shí)候,docker基本穩(wěn)定下來(lái)硅卢,我們也開始享受docker帶來(lái)的種種便利射窒,比如:
發(fā)布服務(wù)再也不用care服務(wù)器的運(yùn)行環(huán)境了藏杖,所有的服務(wù)器都是自動(dòng)分配docker,自動(dòng)部署脉顿,自動(dòng)安裝蝌麸,自動(dòng)運(yùn)行
再也不用擔(dān)心其他服務(wù)引起的磁盤問(wèn)題,cpu問(wèn)題艾疟,系統(tǒng)問(wèn)題了来吩。之前我們固定在一臺(tái)idc上發(fā)布我們所有的服務(wù),導(dǎo)致后面這臺(tái)idc上掛了200多個(gè)服務(wù)蔽莱,日志文件經(jīng)常導(dǎo)致磁盤爆滿弟疆,一旦磁盤爆滿,200多個(gè)服務(wù)就要掛掉一半服務(wù)盗冷。
更好的資源利用怠苔,因?yàn)榻衲赀€沒(méi)有數(shù)據(jù)出來(lái),但個(gè)人預(yù)計(jì)是會(huì)給公司節(jié)省一半的服務(wù)器資源仪糖,既避免了資源浪費(fèi)的同時(shí)嘀略,又保證了服務(wù)的穩(wěn)定運(yùn)行
自動(dòng)遷移,學(xué)歷了docker后乓诽,我們可以自己制作鏡像帜羊,后面服務(wù)遷移的時(shí)候,只要使用我們自己的鏡像鸠天,無(wú)論怎么遷移都不會(huì)出現(xiàn)任何問(wèn)題
對(duì)于運(yùn)維來(lái)說(shuō)讼育,管理更加方便了。