我們都知道,作業系統分為核心和使用者空間。對於 Linux 而言,核心啟動後,會掛載 root
檔案系統為其提供使用者空間支援。而 Docker 映象(Image),就相當於是一個 root
檔案系統。比如官方映象 ubuntu:18.04
就包含了完整的一套 Ubuntu 18.04 最小系統的 root
檔案系統。
Docker 映象是一個特殊的檔案系統,除了提供容器執行時所需的程式、庫、資源、設定等檔案外,還包含了一些為執行時準備的一些設定引數(如匿名卷、環境變數、使用者等)。映象不包含任何動態資料,其內容在構建之後也不會被改變。
因為映象包含作業系統完整的 root
檔案系統,其體積往往是龐大的,因此在 Docker 設計時,就充分利用 Union FS 的技術,將其設計為分層儲存的架構。所以嚴格來說,映象並非是像一個 ISO 那樣的打包檔案,映象只是一個虛擬的概念,其實際體現並非由一個檔案組成,而是由一組檔案系統組成,或者說,由多層檔案系統聯合組成。
映象構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在自己這一層。比如,刪除前一層檔案的操作,實際不是真的刪除前一層的檔案,而是僅在當前層標記為該檔案已刪除。在最終容器執行的時候,雖然不會看到這個檔案,但是實際上該檔案會一直跟隨映象。因此,在構建映象的時候,需要額外小心,每一層儘量只包含該層需要新增的東西,任何額外的東西應該在該層構建結束前清理掉。
分層儲存的特徵還使得映象的複用、客製化變的更為容易。甚至可以用之前構建好的映象作為基礎層,然後進一步新增新的層,以客製化自己所需的內容,構建新的映象。