(三)鏡像分層
? Docker 支持通過擴展現有鏡像,創建新的鏡像,
? 實際上,Docker Hub 中 99% 的鏡像都是通過在 base 鏡像中安裝和配置需要的軟體構建出來的,比如我們現在構建一個新的鏡像,Dockerfile 如下:
FROM debian ①
RUN apt-get install emaces ②
RUN apt-get insatll apache2 ③
CMD ["/bin/bash"] ④
① 新鏡像不再是從 scratch 開始,而是直接在 Debian base 鏡像上構建,
② 安裝 emacs 編輯器,
③ 安裝 apache2,
④ 容器啟動時運行 bash,
構建程序如下圖所示:

可以看到,新鏡像是從 base 鏡像一層一層疊加生成的,每安裝一個軟體,就在現有鏡像的基礎上增加一層,
問什么 Docker 鏡像要采用這種分層結構呢?最大的一個好處就是 - 共享資源,
? 比如:有多個鏡像都從相同的 base 鏡像構建而來,那么 Docker Host 只需在磁盤上保存一份 base 鏡像;同時記憶體中也只需加載一份 base 鏡像,就可以為所有容器服務了,而且鏡像的每一層都可以被共享,我們將在后面更深入地討論這個特性,
? 這時可能就有人會問了:如果多個容器共享一份基礎鏡像,當某個容器修改了基礎鏡像的內容,比如 /etc 下的檔案,這時其他容器的 /etc 是否也會被修改?
? 答案是不會!修改會被限制在單個容器內,這就是我們接下來要學習的容器 Copy-on-Write 特性,
(1)可寫的容器層
? 當容器啟動時,一個新的可寫層被加載到鏡像的頂部, 這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”,

? 所有對容器的改動 - 無論添加、洗掉、還是修改檔案都只會發生在容器層中, 只有容器層是可寫的,容器層下面的所有鏡像層都是只讀的,
? 下面我們深入討論容器層的細節,鏡像層數量可能會很多,所有鏡像層會聯合在一起組成一個統一的檔案系統,如果不同層中有一個相同路徑的檔案,比如 /a,上層的 /a 會覆寫下層的 /a,也就是說用戶只能訪問到上層中的檔案 /a,在容器層中,用戶看到的是一個疊加之后的檔案系統,
-
添加檔案
在容器中創建檔案時,新檔案被添加到容器層中,
-
讀取檔案
在容器中讀取某個檔案時,Docker 會從上往下依次在各鏡像層中查找此檔案,一旦找到,打開并讀入記憶體,
-
修改檔案
在容器中修改已存在的檔案時,Docker 會從上往下依次在各鏡像層中查找此檔案,一旦找到,立即將其復制到容器層,然后修改之,
-
洗掉檔案
在容器中洗掉檔案時,Docker 也是從上往下依次在鏡像層中查找此檔案,找到后,會在容器層中記錄下此洗掉操作,
只有當需要修改時才復制一份資料,這種特性被稱作 Copy-on-Write,可見,容器層保存的是鏡像變化的部分,不會對鏡像本身進行任何修改,這樣就解釋了我們前面提出的問題:容器層記錄對鏡像的修改,所有鏡像層都是只讀的,不會被容器修改,所以鏡像可以被多個容器共享,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/196051.html
標籤:其他
上一篇:一哥們面試騰訊Linux、 C++后臺開發工程師!剛開始就慌了,最后慘不忍睹!
下一篇:容器技術(三)構建鏡像【7】
