什麼是 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 組合起來,再加上它自己可讀寫的那一層。