本文介紹 Docker 概念包含以下:

Image(鏡像/映像檔)

Image 包含了容器執行所需的檔案(應用程式、依賴庫、資源與相關配置),還有一些執行時的配置參數(如匿名卷、環境變量、用戶等)。

雖譯為映像檔,概念類似 VM 的映像檔,但不是 .iso 那樣完整的一大包打包,VM 透過映像檔來啟動作業系統,並執行許多服務。Docker 為了縮小 image 體積、達到更好的維護、擴展性,映像檔則只是檔案系統的儲存狀態,採用「分層存儲」架構,一個 image 其實是多層 images 聯合組成

通常構建 image 時,會基於一個 base image,透過一個個指令添加該容器所需的其他東西。這過程的每個指令,並不會修改 base image,而是創建新的 image 疊在先前的 image 上,最後得到我們要的最終image。

Image 只是一個抽象概念

一個 image 並非一個檔案或一個檔案系統,而是由多層檔案系統聯合組成。Docker 透過 UnionFS 技術實現此分層存儲架構。

只要記得,image 是靜態的(唯讀),構建後就不會再被改變。構建過程的每段指令結束時,就代表創建了一個新的 image,之後的任何指令都只會在之後的 image 起作用。所以指令結束前,要把所有之後不需要的東西清除,否則之後再下指令刪除的話,只會在當前 image 裡隱藏起來。因為那是在先前 image 創建的、存在於先前的 image,當前指令所創建的 image 刪不到它。結果會使 最終image 越來越笨重。

Container(容器)

Image 是靜態的定義,Container 是 Image 運行時的實體

container 運行時會基於 Image,在上頭添加一個當前容器的「容器儲存層」,以儲存執行過程的任何讀寫,並且是可被修改的可寫層。一個 image 可以建立不只一個 container,每個 container 之間都是互相獨立的平台。container 是一個簡易版的 Linux 環境應用程式並可在其中運行程式。當 container 被移除(container rm)此儲存層也會一同被移除。

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/5d5a7177-bbe3-4a4e-8e6d-03d3770ac0ab/Untitled.png