最近公司在創(chuàng)建一個(gè)內(nèi)部使用的小應(yīng)用夹攒,嘗試使用了Docker這個(gè)已經(jīng)被熱炒很久的Devops神器, 部署了Jenkins芹助,應(yīng)用和數(shù)據(jù)庫(kù)的服務(wù),體會(huì)到了一處打包各處運(yùn)行的便利。剛開(kāi)始使用Docker, 有一種深深的感覺(jué)伺糠,它是一個(gè)輕量的虛擬機(jī)训桶,再比較一番,它還是跟虛擬機(jī)有本質(zhì)的區(qū)別谤专。
Docker并不是輕量的虛擬機(jī)
因?yàn)镈ocker和虛擬機(jī)都為應(yīng)用提供隔離的運(yùn)行環(huán)境置侍,并且由于Docker的易用性拦焚,很容易把它看成是輕量的虛擬機(jī)。但是它們?cè)诨A(chǔ)架構(gòu)上是完全不同的秕衙。
要說(shuō)明這個(gè)据忘,我找了一個(gè)例子搞糕。我們可以把虛擬機(jī)看成是獨(dú)棟別墅寞宫,作為別墅,它必須有自己的通風(fēng)鲫忍,供熱和電力系統(tǒng)等基礎(chǔ)設(shè)施悟民,同時(shí)還有必須的臥室篷就,客廳,洗手間和廚房等及舍。如果覺(jué)得客廳房間不夠窟绷,那么你不能共享這些基礎(chǔ)設(shè)施,添加一個(gè)新的房間攘残,而是要重新買一個(gè)房間足夠的別墅为狸。相比而言,docker容器更像是高層住房中的公寓病曾,它們共享整個(gè)建筑的基礎(chǔ)設(shè)施涉瘾,可以在一棟住宅中擁有各種不同的戶型(運(yùn)行各種不同鏡像的容器)立叛。
從上面的比較中我們可以看到,它們雖然都是為應(yīng)用提供獨(dú)立的運(yùn)行環(huán)境秘蛇,但是他們的構(gòu)建理念是完全不同的赁还,虛擬機(jī)是要在硬件上隔離出完整操作系統(tǒng)的方方面面艘策,但是docker容器是共享操作系統(tǒng)基礎(chǔ)設(shè)施,并在docker主機(jī)上運(yùn)行打包好運(yùn)行環(huán)境的應(yīng)用罚渐。所以docker并不是一個(gè)虛擬機(jī)技術(shù)荷并,而是一個(gè)應(yīng)用交付技術(shù)青扔。在虛擬機(jī)的世界中源织,抽象的單位是一個(gè)包含應(yīng)用代碼和依賴資源的虛擬機(jī)翩伪,它打包應(yīng)用在物理主機(jī)上運(yùn)行依賴的所有資源,生成一個(gè)可以在各種主機(jī)上運(yùn)行的二進(jìn)制產(chǎn)品谈息。在Docker的世界中缘屹,抽象的單位是應(yīng)用,更準(zhǔn)確的說(shuō)是一個(gè)服務(wù)侠仇,一般一個(gè)應(yīng)用都是由多個(gè)服務(wù)組成囊颅。基于Docker容器傅瞻,我們的應(yīng)用能更容易的被拆分成細(xì)粒度的組件,這種技術(shù)會(huì)改變我們應(yīng)用架構(gòu)的方式盲憎。
Docker容器的備份
我們?cè)趺磦浞軩ocker容器呢嗅骄?其實(shí)我們并不需要備份容器。在使用Docker時(shí)饼疙,應(yīng)用數(shù)據(jù)并不在保存在容器中窑眯,它存儲(chǔ)在位于運(yùn)行docker的服務(wù)器上的命名卷(volume)中[一塊物理存儲(chǔ)空間], 卷可以在不同的容器間共享炊林,我們只需要備份這些卷僧叉,并不需要備份容器隘道。所以理想情況下,容器是無(wú)狀態(tài)并且不可修改的。如果我們想更新應(yīng)用壹置,需要做的是更新Docker鏡像,同時(shí)基于新的鏡像重新創(chuàng)建容器,創(chuàng)建容器只需要花幾秒鐘余佃。
最后
通過(guò)以上面的比對(duì)诸蚕,我們可以發(fā)現(xiàn)Docker和VM是針對(duì)解決不同問(wèn)題而提出的技術(shù),一個(gè)是打包應(yīng)用運(yùn)行環(huán)境在各種操作系統(tǒng)上運(yùn)行,一個(gè)是打包了部署應(yīng)用的整個(gè)操作系統(tǒng),并運(yùn)行在各種服務(wù)器上提陶。他們不僅不是一個(gè)有你沒(méi)我的替代關(guān)系升筏,而是互相結(jié)合可以發(fā)揮更大威力的組合铅忿。有了Docker,它將改變部署應(yīng)用的方式渗鬼,可以方便的配置出不同的運(yùn)行環(huán)境命锄,隨著配置應(yīng)用運(yùn)行環(huán)境的成本降低被盈,我們可以將應(yīng)用拆解成粒度更小的服務(wù)身堡,改變我們?cè)O(shè)計(jì)系統(tǒng)的方式季稳。