Docker真的萬(wàn)能嗎?看這一篇就夠了
Docker并不是容器,而是創(chuàng)建容器的工具,是應(yīng)用容器引擎。其實(shí)看它的兩句口號(hào)就可以很容易的理解它。第一句是“Build, Ship and Run”翻譯過(guò)來(lái)便是“搭建、發(fā)送、運(yùn)行”;第二句是“Build once,Run anywher”也就是只要搭建一次,到處都能用。比如你想在一片空地上蓋房子,但你需要很多步驟才能將這個(gè)房子蓋好,可是住了一段時(shí)間后你卻想搬家了,只能重新蓋房子。
Docker就像一個(gè)魔法,可以把你原本蓋好的房子復(fù)制了放進(jìn)背包里然后粘貼到另一個(gè)空地,其實(shí)就是“鏡像”。Docker的三大核心概念分別是鏡像(Image)、容器(Container)、倉(cāng)庫(kù)(Repository)。鏡像不包含任何動(dòng)態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會(huì)被改變。每個(gè)人生成的不同鏡像,可以互相交換,最終它就變成了一個(gè)公共倉(cāng)庫(kù)。
使用Docker時(shí)候,你會(huì)發(fā)現(xiàn)它真的是個(gè)寶藏,可以秒級(jí)開(kāi)啟應(yīng)用,不用特別繁瑣的配置什么,可以減輕很多這種重復(fù)性的勞動(dòng)。Docker不適合虛擬化桌面,它比較適合linux族,Unix族以及應(yīng)用程序的虛擬化。邏輯是這樣的,在操作系統(tǒng)的概念里面,有一個(gè)內(nèi)核,docker是基于Linux 內(nèi)核,它不適用于Windows虛擬化,Windows操作系統(tǒng)有另外一個(gè)虛擬技術(shù)Hype-y。
Docker有一些缺點(diǎn),表面上很方便,實(shí)際上工具鏈之間的銜接略微糟糕。它將linux的namespace做了深層次的封裝,用戶上手的難度低,部署到生產(chǎn)環(huán)境也很容易。但僅限于小型項(xiàng)目,換成稍微復(fù)雜一些的項(xiàng)目,依賴關(guān)系非常多的話,就能發(fā)現(xiàn)它會(huì)出現(xiàn)各種奇怪的bug。比如docker-compose之間的依賴不會(huì)等待被依賴者加載完畢,掛載volume有時(shí)會(huì)無(wú)法在entrypoint或command中執(zhí)行命令,必須要用COPY等等,變得復(fù)雜和難以維護(hù)。
在進(jìn)行多機(jī)部署的時(shí)候,跟著官方文檔走都不能成功,上stackoverflow和github上查了半天也查不到任何解決辦法,是經(jīng)常發(fā)生的事情。Docker確實(shí)可以降低了運(yùn)維難度,但是運(yùn)營(yíng)成本卻提升了。它最大的一個(gè)缺點(diǎn)是十分吃硬盤。Docker封裝的namespace,并沒(méi)有對(duì)文件進(jìn)行進(jìn)一步的管理,只是粗暴的將文件到處復(fù)制粘貼。當(dāng)服務(wù)器上開(kāi)了數(shù)百個(gè)容器后發(fā)現(xiàn)1TB的硬盤被吃掉了一半時(shí),意味著需要不停增加服務(wù)器資源才能維持系統(tǒng)的運(yùn)行。除了磁盤空間的占用外,作為一名中國(guó)用戶,時(shí)區(qū)、墻等都是問(wèn)題。
當(dāng)然所有問(wèn)題都是可以解決的,只是比較浪費(fèi)時(shí)間。毋庸置疑Docker是個(gè)非??岬墓ぞ撸膬?yōu)點(diǎn)還是遠(yuǎn)大于缺點(diǎn)的。但它并不是萬(wàn)能的,當(dāng)你遇到架構(gòu)簡(jiǎn)單,類似數(shù)據(jù)庫(kù)+應(yīng)用程序這種情況可以不用Docker,業(yè)務(wù)上Docker會(huì)占用太多資源的時(shí)候也可以考慮不用,因?yàn)榉?wù)器資源挺貴。