Docker支援通過擴充套件現有映象,建立新的映象
實際上Docker Hub上99%的映象都是在base映象的基礎上,安裝和配置軟體後構建出來的。
FROM debian # 映象不在是從scratch開始,而是從debian base開始
RUN apt-get install emacs # 安裝emacs
RUN apt-get install apache2 # 安裝apache2
CMD ["/bin/bash"] # 容器啟動時執行bash
構建過程如下圖:
新映象是從base映象一層一層疊加生成的。每安裝一個軟體,就在現有映象的基礎上增加一層
Docker為什麼要分這麼多層 -- 共享資源。
比如好多映象都是從相同base的基礎上構建出來來,那麼 Docker Host上只需要儲存一份base即可,同時記憶體中也只需載入一份base映象,映象的每一層都可以被分享,
Copy-on-Write
多個容器共享一個基礎映象,那麼當某個容器修改了配置檔案,其他容器會受影響嗎? 不會
容器在啟動時,會建立一個新的可寫層,載入到映象的頂部。這一層通常被稱作容器層,容器層下面的是映象層
對容器的所有改動,都只發生在容器層,下面的映象層是隻讀的。
所有映象層疊加起來組成一個統一的檔案系統。如果不同層中有一個相同的檔案,,比如 /a ,上層的 /a 會覆蓋下層的 /a ,使用者只能看到最靠近頂端映象層中的/a
1、新增檔案 -- 新檔案會被新增到容器層中
2、讀取檔案 -- 在映象層中從上往下找,找到後不再繼續向下查詢
3、修改檔案 -- 在映象層中從上往下找,找到後複製到容器層進行修改
4、刪除檔案 -- 在映象層中從上往下找,找到後在容器層將該檔案標記為刪除
只有當需要修改時才從映象層複製一份到容器層,這個特性叫做 Copy-on-Write 。容器層儲存的是映象變化的部分,並不會對映象本身進行修改