映象的分層結構 每天5分鐘玩轉容器技術(11)

2021-10-10 17:54:51 字數 1934 閱讀 2109

原創 cloudman cloudman

2017-05-06

映象的分層結構

docker 支援通過擴充套件現有映象,建立新的映象。

實際上,docker hub 中 99% 的映象都是通過在 base 映象中安裝和配置需要的軟體構建出來的。比如我們現在構建乙個新的映象,dockerfile 如下:

① 新映象不再是從 scratch 開始,而是直接在 debian base 映象上構建。

② 安裝 emacs 編輯器。

③ 安裝 apache2。

④ 容器啟動時執行 bash。

構建過程如下圖所示:

可以看到,新映象是從 base 映象一層一層疊加生成的。每安裝乙個軟體,就在現有映象的基礎上增加一層。

問什麼 docker 映象要採用這種分層結構呢?

最大的乙個好處就是 -共享資源

比如:有多個映象都從相同的 base 映象構建而來,那麼 docker host 只需在磁碟上儲存乙份 base 映象;同時記憶體中也只需載入乙份 base 映象,就可以為所有容器服務了。而且映象的每一層都可以被共享,我們將在後面更深入地討論這個特性。

這時可能就有人會問了:如果多個容器共享乙份基礎映象,當某個容器修改了基礎映象的內容,比如 /etc 下的檔案,這時其他容器的 /etc 是否也會被修改?

答案是不會!

修改會被限制在單個容器內。

這就是我們接下來要學習的容器 copy-on-write 特性。

可寫的容器層

當容器啟動時,乙個新的可寫層被載入到映象的頂部。

這一層通常被稱作「容器層」,「容器層」之下的都叫「映象層」。

所有對容器的改動 - 無論新增、刪除、還是修改檔案都只會發生在容器層中。

只有容器層是可寫的,容器層下面的所有映象層都是唯讀的

下面我們深入討論容器層的細節。

映象層數量可能會很多,所有映象層會聯合在一起組成乙個統一的檔案系統。如果不同層中有乙個相同路徑的檔案,比如 /a,上層的 /a 會覆蓋下層的 /a,也就是說使用者只能訪問到上層中的檔案 /a。在容器層中,使用者看到的是乙個疊加之後的檔案系統。

新增檔案

在容器中建立檔案時,新檔案被新增到容器層中。

讀取檔案

在容器中讀取某個檔案時,docker 會從上往下依次在各映象層中查詢此檔案。一旦找到,開啟並讀入記憶體。

修改檔案

在容器中修改已存在的檔案時,docker 會從上往下依次在各映象層中查詢此檔案。一旦找到,立即將其複製到容器層,然後修改之。

刪除檔案

在容器中刪除檔案時,docker 也是從上往下依次在映象層中查詢此檔案。找到後,會在容器層中記錄下此刪除操作。

只有當需要修改時才複製乙份資料,這種特性被稱作 copy-on-write。可見,容器層儲存的是映象變化的部分,不會對映象本身進行任何修改。

這樣就解釋了我們前面提出的問題:容器層記錄對映象的修改,所有映象層都是唯讀的,不會被容器修改,所以映象可以被多個容器共享

理解了映象的原理和結構,下一節我們學習如何構建映象。

映象的分層結構 每天5分鐘玩轉容器技術(11)

docker 支援通過擴充套件現有映象,建立新的映象。實際上,docker hub 中 99 的映象都是通過在 base 映象中安裝和配置需要的軟體構建出來的。比如我們現在構建乙個新的映象,dockerfile 如下 新映象不再是從 scratch 開始,而是直接在 debian base 映象上構...

構建映象 每天5分鐘玩轉容器技術(12)

對於 docker 使用者來說,最好的情況是不需要自己建立映象。幾乎所有常用的資料庫 中介軟體 應用軟體等都有現成的 docker 官方映象或其他人和組織建立的映象,我們只需要稍作配置就可以直接使用。使用現成映象的好處除了省去自己做映象的工作量外,更重要的是可以利用前人的經驗。特別是使用那些官方映象...

構建映象 每天5分鐘玩轉容器技術(12)

對於 docker 使用者來說,最好的情況是不需要自己建立映象。幾乎所有常用的資料庫 中介軟體 應用軟體等都有現成的 docker 官方映象或其他人和組織建立的映象,我們只需要稍作配置就可以直接使用。使用現成映象的好處除了省去自己做映象的工作量外,更重要的是可以利用前人的經驗。特別是使用那些官方映象...