概述
經過上一篇之后,對Docker應該已經不陌生了。
上一篇傳送門《微服務中的容器技術---Docker(一),Docker的安裝和使用》
Docker鏡像
那么我們應該知道鏡像和容器該如何區分了,這里就更形象地說明一下:
Docker鏡像是一個只讀的Docker容器模板,含有啟動Docker容器所需的文件系統結構及其內容,因此是啟動一個Docker容器的基礎。Docker鏡像的文件內容以及一些運行Docker容器的配置文件組成了Docker容器的靜態文件系統運行環境–rootfs。可以這么理解,Docker鏡像是Docker容器的靜態視角,Docker容器是Docker鏡像的運行狀態
Docker鏡像
從上圖可以看到,新鏡像是從 base 鏡像一層一層疊加生成的。每安裝一個軟件,就在現有鏡像的基礎上增加一層
- 共享宿主機的Kernel
- Base鏡像提供的是最小的Linux發行版
Docker 支持通過擴展現有鏡像,創建新的鏡像。實際上,Docker Hub 中 99% 的鏡像都是通過在 base 鏡像中安裝和配置需要的軟件構建出來的。 - 同一Docker主機支持運行多種Linux發行版
- 采用分層的最大好處: 共享資源
繼續來看Docker的分層結構
Docker容器層
當容器啟動時,一個新的可寫層被加載到鏡像的頂部。這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”。
- Copy-on-Write
如果多個容器共享一份基礎鏡像,當某個容器修改了基礎鏡像的內容,比如 /etc 下的文件,這時其他容器的 /etc 是不會被修改的,修改只會被限制在單個容器內(詳細見:展開說明) - 只有容器層是可寫的,容器層下面的所有鏡像層都是只讀
- Docker從上往下依次查找
- 容器層保存鏡像變化的部分,并不會對鏡像本身做任何修改
- 一個鏡像最多127層
※展開說明:
鏡像層數量可能會很多,所有鏡像層會聯合在一起組成一個統一的文件系統。如果不同層中有一個相同路徑的文件,比如 /a,上層的 /a 會覆蓋下層的 /a,也就是說用戶只能訪問到上層中的文件 /a。在容器層中,用戶看到的是一個疊加之后的文件系統。
文件操作
文件操作 | 說明 |
---|---|
添加文件 | 在容器中添加文件時,新文件被添加到容器層*中 |
讀取文件 | 在容器中讀取某個文件時,Docker會從上往下依次從各個鏡像層中查找此文件, 一旦找到,便將它復制到容器層中,然后打開并讀入內存。 |
修改文件 | 在容器中修改某個文件時,Docker會從上往下依次從各個鏡像層中查找此文件, 一旦找到,便將它復制到容器層中,然后修改它。 |
刪除文件 | 在容器中刪除某個文件時,Docker會從上往下依次從各個鏡像層中查找此文件, 一旦找到,便在容器層中記錄下此刪除操作。(容器層只記錄刪除操作) |
只有當需要修改時才復制一份數據,這種特性被稱作 Copy-on-Write。可見,容器層保存的是鏡像變化的部分,不會對鏡像本身進行任何修改。
這樣就解釋了我們前面提出的問題:容器層記錄對鏡像的修改,所有鏡像層都是只讀的,不會被容器修改,所以鏡像可以被多個容器共享。