什麼是
Docker Image
?
Image 這東西可是 Docker 裡面相當重要的一個要素,沒有它你就建立不了 Container
而正確來說 Image 是 Layers of Image …
如果以盤子比喻的話,大概就是
一疊盤子
,
沒錯,就是你會在資料結構的書上看到的堆疊結構那個樣子,
不是說你這個人是盤子喔,別誤會。
這一疊的盤子,我們就稱之為
Layers of Image
,
每一面盤子就是一個 Image layer,內容物為一個含有多個 File 的 Filesystem,
這每一面盤子最後會透過一個叫作
Union File System 的技術
,
將每一個 Layer 的 Image 結合再一起,讓你「
看起來
」是只有一個 Filesystem。
這每一層的 Layer 又是怎麼形成的呢?
還記得我們在專案中使用到的
Dockerfile
嗎?
它的每一條指令,從
FROM, RUN, COPY, … ENTRYPOINT
等等,
都會先建立一個
暫時的 container
,執行完指令之後,把結果記錄成一個 image layer,
而最後最後的結果,其實就是最後一個指令執行完的 image layer 的 ID,
如果想看完整的一個 image 總共有多少 layers,可以透過
docker history
來看到(e.g. docker history ubuntu)
重點來了,在我們執行
docker run
的時候,就會在這一個 Layers of image 的頂端建立一個
可讀寫
的 layer,
這意味著了那一層之外,所有以下的 Image layer 都是
唯讀
的,
因此這些唯讀的 Image Layer 在不同的 container 間是
可以共用
的,
更代表著只要是相同內容的 Image layer,就只需要下載一份即可,
這也是為什麼有時候在 docker pull 或是 docker build 的時候可以看到
use cache
,
因為已經有相同內容物的 Image layer 存在了,直接拿來使用就好了。
結論: container 是一個 process,而它能使用的 filesystem 就是所有唯讀的 image layer 組合起來,再加上它自己可讀寫的那一層。