Docker 基本原理
Docker 是什麼
Docker 一詞的英文直譯為「碼頭工人」,但是實際上它更像是碼頭上的集裝箱。類比於集裝箱,Docker 實際上制定了一套標準,基於這套標準製作出來的容器可以輕鬆地解決應用發布與運維遇到的難題。
Docker 帶來的好處主要有以下幾點:
1、整體交付:把應用的依賴打包到 docker 鏡像中,保證部署的每一台機器依賴都是完整的,同時使用容器技術屏蔽了操作系統和硬體的差異,使得開發、測試、部署、運維過程中能夠保持一致,解決了很多維護難題。
2、資源利用率高:相比於 VM ,docker 耗費的系統資源更少,空閑的內存可以被宿主機和其他容器使用,相同的資源可以部署更多容器。
3、更快的啟動時間:docker 只是隔離了程序的依賴關係,沒有 Guest OS,啟動速度比 VM 快得多。
傳統的虛擬機技術是虛擬出一套硬體,在虛擬的硬體上運行一個操作系統,虛擬機中的應用在 Guest OS 中運行。而 docker 容器內的應用直接在宿主機上運行,容器沒有虛擬出硬體也沒有自己的內核,是一種輕量級的虛擬化技術。從下圖的對比中可以看出,Docker 的 Docker Engine 層替代了虛擬機中的 Hypervisor 層和 Guest OS 層。
Docker 基本概念
下圖展示了 Docker 技術的基本組成,主要包括 Client、Deamon、Container、Images 和 Registry。
Docker Client:Docker 客戶端,提供給用戶一個終端,用戶輸入 Docker 提供的命令來管理本地或遠程的伺服器。
Docker Daemon:服務端守護進程,接收 Client 發送的命令並執行相應的操作。
Docker Images:Docker 鏡像,一個特殊的文件系統,封裝了運行時需要的庫、資源、應用等。
Docker Container:Docker 容器,提供了運行環境,通過 Docker Images 啟動,在 Docker Images 基礎上運行應用。
Docker Registry:Docker 倉庫,用來管理鏡像,實現鏡像的上傳、下載、瀏覽。
Docker 鏡像
Docker 鏡像是一個特殊的文件系統,這個文件系統封裝了運行時需要的庫、資源、應用等。Docker 鏡像採用分層存儲結構。構建時一層一層地進行,每一層構建好後不再變化,後一層以前一層為基礎進行構建,最終組成多層文件系統。
一個 Docker 鏡像可以構建於另一個 Docker 鏡像之上,這種層疊關係可以是多層的。第1層的鏡像層我們稱之為基礎鏡像(Base Image),其他層的鏡像(除了最頂層)我們稱之為父層鏡像(Parent Image)。這些鏡像繼承了他們的父層鏡像的所有屬性和設置,並在Dockerfile中添加了自己的配置。
Docker 容器
Docker 容器本質上是一個進程,運行於自己獨立的命名空間中,所有的數據都存儲在容器中。容器銷毀後,這些數據也隨之消失。多個容器互相之間是隔離的,一個容器所做的任何變更都隻影響容器自己。
運行容器需要指定一個鏡像,容器會在鏡像上增加一個可寫層。基礎鏡像本身的變更不會影響運行中的容器。需要執行 docker commit,才能保存容器中的數據,這時在鏡像的基礎上疊加上容器的存儲層生成一個新的鏡像。
鏡像與容器的關係就像是面向對象中類與實例的關係,鏡像是靜態的定義,而容器是運行時的實體。容器可以進行創建、啟動、停止、刪除等操作。
分享學習筆記和技術總結,內容涉及 Java 進階、架構設計、前沿技術、演算法與數據結構、資料庫、中間件等多個領域。本文首發於公眾號「後端開發那點事兒」。
推薦閱讀:
※漫畫賞析:Linux 版 SQL Server
※在Ubuntu 16.04上製作 NVIDIA cuDNN Docker image
※Docker 的應用場景在哪裡?
※ELB配合Unicorn集群導致響應緩慢的問題
TAG:Docker |