2023 iT邦鐵人賽 Day 18 - 從映像層到容器

前言

昨天我們已經對映像檔以及映像層之間的關係,更加熟悉了,今天我們要來拉大視野一探映像層、映像檔到容器,這三者之間的神秘又糾纏的關係。

映像檔裡的映像層

現在大家都知道了,映像檔是由一層一層的映像層堆疊而成。

所以昨天提到 httpd 的映像層有 4ee097f9a36694662ba12854595a05b7c0ad03682c916abd7e88a38e211a

1
2
3
4
5
6
7
8
9
10
-----------------
| httpd |
| |
| 4ee097f9a366 |
| 94662ba12854 |
| 595a05b7c0ad |
| 03682c916abd |
| 7e88a38e211a |
| |
-----------------

所有的映像層都是唯讀的,不可編輯變動的。

當映像檔建立容器時

當我今天用 httpd 建立一個容器時,Docker 做得事情是將映像檔裡的映像層拉出來以供容器使用,因此這些映像層又稱為映像檔的共享層。這就是為什麼可以不斷產生容器。

此外,在第 14 天提到,Docker 會自動給容器一個可寫層。

這時,這個容器就會有映像層 + 可寫層,一個來自映像檔,一個來自Docker。

1
2
3
4
5
6
7
8
9
10
11
12
-----------------
| 容器一 |
|---------------|
| 寫入層 |
|---------------|
| 映像層 |
| 4ee097f9a366 |
| 94662ba12854 |
| 595a05b7c0ad |
| 03682c916abd |
| 7e88a38e211a |
-----------------

如果在建立容器時有綁定掛載的話:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-----------------
| 容器一 |
|---------------|
| 寫入層 |
|---------------|
| 約定掛載 |
|---------------|
| 映像層 |
| 4ee097f9a366 |
| 94662ba12854 |
| 595a05b7c0ad |
| 03682c916abd |
| 7e88a38e211a |
-----------------

那如果有 volume 掛載:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-----------------
| 容器一 |
|---------------|
| 寫入層 |
|---------------|
| 約定掛載 |
|---------------|
| volume 掛載 |
|---------------|
| 映像層 |
| 4ee097f9a366 |
| 94662ba12854 |
| 595a05b7c0ad |
| 03682c916abd |
| 7e88a38e211a |
-----------------

這些容器的結構圖,就是容器的檔案系統的結構,由映像層、寫入層、掛載所組成。

在 Day 13 提到,最基本的檔案系統是映像層與寫入層構成。那最完整的就是再加上掛載。

那映像層跟寫入層都是透過建立容器時所取得的元件,所以理當隨容器被刪除後跟著消失。

掛載則是透過本機的資料夾,或是 Docker 另外 create 出來的 volume,因此不像映像層跟寫入層一樣,會跟著容器的生命週期一起不見。

結論

今天我們貫穿了映像層、映像檔到容器,彼此之間的關係,且一併回顧之前提到卻有點模糊的概念,透過今天這樣從微觀到宏觀的介紹方式,讓大家明白這三者之間到底是什麼樣的存在,彼此又是誰的彼此。

明天我們來動手實作映像檔的指令操作吧!