Docker 是什么
Docker 一詞的英文直譯為“碼頭工人”,但是實際上它更像是碼頭上的集裝箱。類比于集裝箱,Docker 實際上制定了一套標準,基于這套標準制作出來的容器可以輕松地解決應(yīng)用發(fā)布與運維遇到的難題。
Docker 帶來的好處主要有以下幾點:
1、整體交付:把應(yīng)用的依賴打包到 docker 鏡像中,保證部署的每一臺機器依賴都是完整的,同時使用容器技術(shù)屏蔽了操作系統(tǒng)和硬件的差異,使得開發(fā)、測試、部署、運維過程中能夠保持一致,解決了很多維護難題。
2、資源利用率高:相比于 VM ,docker 耗費的系統(tǒng)資源更少,空閑的內(nèi)存可以被宿主機和其他容器使用,相同的資源可以部署更多容器。
3、更快的啟動時間:docker?只是隔離了程序的依賴關(guān)系,沒有 Guest OS,啟動速度比 VM 快得多。
傳統(tǒng)的虛擬機技術(shù)是虛擬出一套硬件,在虛擬的硬件上運行一個操作系統(tǒng),虛擬機中的應(yīng)用在 Guest OS 中運行。而 docker 容器內(nèi)的應(yīng)用直接在宿主機上運行,容器沒有虛擬出硬件也沒有自己的內(nèi)核,是一種輕量級的虛擬化技術(shù)。從下圖的對比中可以看出,Docker 的 Docker Engine 層替代了虛擬機中的 Hypervisor 層和 Guest OS 層。
Docker 基本概念
下圖展示了 Docker 技術(shù)的基本組成,主要包括 Client、Deamon、Container、Images 和Registry。
Docker Client:Docker 客戶端,提供給用戶一個終端,用戶輸入Docker 提供的命令來管理本地或遠程的服務(wù)器。
Docker Daemon:服務(wù)端守護進程,接收 Client 發(fā)送的命令并執(zhí)行相應(yīng)的操作。
Docker Images:Docker 鏡像,一個特殊的文件系統(tǒng),封裝了運行時需要的庫、資源、應(yīng)用等。
Docker Container:Docker 容器,提供了運行環(huán)境,通過Docker Images 啟動,在Docker Images 基礎(chǔ)上運行應(yīng)用。
Docker Registry:Docker 倉庫,用來管理鏡像,實現(xiàn)鏡像的上傳、下載、瀏覽。
Docker 鏡像
Docker 鏡像是一個特殊的文件系統(tǒng),這個文件系統(tǒng)封裝了運行時需要的庫、資源、應(yīng)用等。Docker 鏡像采用分層存儲結(jié)構(gòu)。構(gòu)建時一層一層地進行,每一層構(gòu)建好后不再變化,后一層以前一層為基礎(chǔ)進行構(gòu)建,最終組成多層文件系統(tǒng)。
一個 Docker 鏡像可以構(gòu)建于另一個 Docker 鏡像之上,這種層疊關(guān)系可以是多層的。第1層的鏡像層我們稱之為基礎(chǔ)鏡像(Base Image),其他層的鏡像(除了最頂層)我們稱之為父層鏡像(Parent Image)。這些鏡像繼承了他們的父層鏡像的所有屬性和設(shè)置,并在Dockerfile中添加了自己的配置。
Docker 容器
Docker 容器本質(zhì)上是一個進程,運行于自己獨立的命名空間中,所有的數(shù)據(jù)都存儲在容器中。容器銷毀后,這些數(shù)據(jù)也隨之消失。多個容器互相之間是隔離的,一個容器所做的任何變更都只影響容器自己。
運行容器需要指定一個鏡像,容器會在鏡像上增加一個可寫層?;A(chǔ)鏡像本身的變更不會影響運行中的容器。需要執(zhí)行 docker commit,才能保存容器中的數(shù)據(jù),這時在鏡像的基礎(chǔ)上疊加上容器的存儲層生成一個新的鏡像。
鏡像與容器的關(guān)系就像是面向?qū)ο笾蓄惻c實例的關(guān)系,鏡像是靜態(tài)的定義,而容器是運行時的實體。容器可以進行創(chuàng)建、啟動、停止、刪除等操作。
分享學習筆記和技術(shù)總結(jié),內(nèi)容涉及 Java 進階、架構(gòu)設(shè)計、前沿技術(shù)、算法與數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)庫、中間件等多個領(lǐng)域。本文首發(fā)于公眾號“后端開發(fā)那點事兒”。