Docker 是什么
Docker 一詞的英文直譯為“碼頭工人”,但是實(shí)際上它更像是碼頭上的集裝箱辨萍。類比于集裝箱,Docker 實(shí)際上制定了一套標(biāo)準(zhǔn)锈玉,基于這套標(biāo)準(zhǔn)制作出來的容器可以輕松地解決應(yīng)用發(fā)布與運(yùn)維遇到的難題爪飘。
Docker 帶來的好處主要有以下幾點(diǎn):
1、整體交付:把應(yīng)用的依賴打包到 docker 鏡像中拉背,保證部署的每一臺機(jī)器依賴都是完整的犁罩,同時(shí)使用容器技術(shù)屏蔽了操作系統(tǒng)和硬件的差異两疚,使得開發(fā)丐巫、測試鞋吉、部署谓着、運(yùn)維過程中能夠保持一致,解決了很多維護(hù)難題。
2、資源利用率高:相比于 VM 纵柿,docker 耗費(fèi)的系統(tǒng)資源更少昂儒,空閑的內(nèi)存可以被宿主機(jī)和其他容器使用,相同的資源可以部署更多容器燕少。
3、更快的啟動(dòng)時(shí)間:docker?只是隔離了程序的依賴關(guān)系岳守,沒有 Guest OS,啟動(dòng)速度比 VM 快得多譬重。
傳統(tǒng)的虛擬機(jī)技術(shù)是虛擬出一套硬件,在虛擬的硬件上運(yùn)行一個(gè)操作系統(tǒng),虛擬機(jī)中的應(yīng)用在 Guest OS 中運(yùn)行。而 docker 容器內(nèi)的應(yīng)用直接在宿主機(jī)上運(yùn)行,容器沒有虛擬出硬件也沒有自己的內(nèi)核澈吨,是一種輕量級的虛擬化技術(shù)碾盟。從下圖的對比中可以看出,Docker 的 Docker Engine 層替代了虛擬機(jī)中的 Hypervisor 層和 Guest OS 層。
Docker 基本概念
下圖展示了 Docker 技術(shù)的基本組成,主要包括 Client厦幅、Deamon、Container休弃、Images 和Registry塔猾。
Docker Client:Docker 客戶端桥帆,提供給用戶一個(gè)終端,用戶輸入Docker 提供的命令來管理本地或遠(yuǎn)程的服務(wù)器祈匙。
Docker Daemon:服務(wù)端守護(hù)進(jìn)程,接收 Client 發(fā)送的命令并執(zhí)行相應(yīng)的操作黎泣。
Docker Images:Docker 鏡像坷澡,一個(gè)特殊的文件系統(tǒng)斟赚,封裝了運(yùn)行時(shí)需要的庫食绿、資源罐柳、應(yīng)用等勺择。
Docker Container:Docker 容器稿辙,提供了運(yùn)行環(huán)境舌菜,通過Docker Images 啟動(dòng)日月,在Docker Images 基礎(chǔ)上運(yùn)行應(yīng)用蜂绎。
Docker Registry:Docker 倉庫怪瓶,用來管理鏡像敛滋,實(shí)現(xiàn)鏡像的上傳落竹、下載泌霍、瀏覽。
Docker 鏡像
Docker 鏡像是一個(gè)特殊的文件系統(tǒng)述召,這個(gè)文件系統(tǒng)封裝了運(yùn)行時(shí)需要的庫、資源、應(yīng)用等缅疟。Docker 鏡像采用分層存儲結(jié)構(gòu)沼填。構(gòu)建時(shí)一層一層地進(jìn)行岩饼,每一層構(gòu)建好后不再變化忌愚,后一層以前一層為基礎(chǔ)進(jìn)行構(gòu)建,最終組成多層文件系統(tǒng)。
一個(gè) Docker 鏡像可以構(gòu)建于另一個(gè) Docker 鏡像之上,這種層疊關(guān)系可以是多層的民傻。第1層的鏡像層我們稱之為基礎(chǔ)鏡像(Base Image),其他層的鏡像(除了最頂層)我們稱之為父層鏡像(Parent Image)奴迅。這些鏡像繼承了他們的父層鏡像的所有屬性和設(shè)置扁耐,并在Dockerfile中添加了自己的配置块仆。
Docker 容器
Docker 容器本質(zhì)上是一個(gè)進(jìn)程,運(yùn)行于自己獨(dú)立的命名空間中蜜暑,所有的數(shù)據(jù)都存儲在容器中。容器銷毀后拙毫,這些數(shù)據(jù)也隨之消失。多個(gè)容器互相之間是隔離的缺前,一個(gè)容器所做的任何變更都只影響容器自己衅码。
運(yùn)行容器需要指定一個(gè)鏡像,容器會在鏡像上增加一個(gè)可寫層脊岳∈哦危基礎(chǔ)鏡像本身的變更不會影響運(yùn)行中的容器垛玻。需要執(zhí)行 docker commit,才能保存容器中的數(shù)據(jù)奶躯,這時(shí)在鏡像的基礎(chǔ)上疊加上容器的存儲層生成一個(gè)新的鏡像帚桩。
鏡像與容器的關(guān)系就像是面向?qū)ο笾蓄惻c實(shí)例的關(guān)系,鏡像是靜態(tài)的定義巫糙,而容器是運(yùn)行時(shí)的實(shí)體朗儒。容器可以進(jìn)行創(chuàng)建、啟動(dòng)参淹、停止醉锄、刪除等操作。
分享學(xué)習(xí)筆記和技術(shù)總結(jié)浙值,內(nèi)容涉及 Java 進(jìn)階恳不、架構(gòu)設(shè)計(jì)、前沿技術(shù)开呐、算法與數(shù)據(jù)結(jié)構(gòu)烟勋、數(shù)據(jù)庫、中間件等多個(gè)領(lǐng)域筐付。本文首發(fā)于公眾號“后端開發(fā)那點(diǎn)事兒”卵惦。