Docker Image Layer


上面這張圖,如果你已經使用過 Docker,一定不會感到陌生,當我們 Pull 一個 Docker Image 時,時常會看到這樣的畫面,司空見慣不足為奇,那泰勞為什麼要以這張圖為開頭呢?嘿嘿~當然是有其重要之處阿!

不知道有沒有人有過一樣的疑惑,為什麼 Pull 的時候要顯示這些資訊?這些資訊又代表著什麼含意呢?如果你有興趣,那就繼續看下去吧!

參考資料:
[StackOverflow]Docker images "Already exists"? 
[StackOverflow]What are docker image layers ? 
[Docker Docs]Images and Layers 

先思考一下,Pull 時顯示的資訊應該跟那個 Image 有相關,而 Pull 的過程列出了很多個雜湊值,這些值所代表的東西,有些已經存在 (Already exists),有些剛完成 Pull (Pull complete),有些還在等待 Pull 的動作 (Waiting),難道這些東西全部合在一起就是一個 Image?

沒錯!這些雜湊值代表的就是一個個 Docker Image Layer,而一個 Docker Image 就是由數個 Image Layer 所組成!來看一段 Docker 的基本觀念。

(1) Docker container are running systems defined by Docker images.
(2) Docker images are made up of one or more Docker layers.
(3) Every line in Dockerfile adds up a Docker layer which makes up your Docker image.

(1) 如果將 Docker image 比喻成 Java 的類別(Class),那麼 Docker container 就如同在 Java 裡面從某個類別 new 一個實例(Instance)出來。

(2) Docker image 由一或多個 Docker layer 所組成。

(3) 撰寫並且編譯 Dockerfile 可以生成 Docker image,在 Dockerfile 裡的每一行命令,代表一個 Docker layer。一個 Layer 就像是 Git 裡的一個 Commit,它紀錄的是這個命令所做的改變。

下方這張擷取自 Docker Docs 的圖片顯示了 Layer 如何組成一個 Image 的架構。

開頭的那張圖之所以會出現 Already exists,就是因為組成那個 Image 的 Layers,有部份已經存在於本地端,因此只需要 Pull 目前沒有的即可。Docker 這麼設計有很多的好處,不但可以省下 Pull 時間,還可以省下一些空間,因為同樣的 Layer 在不同 Image 之間是可以共用的!

承上,從 Dockerfile 生成新的 Image 也有一樣的規則,建立 Image 時會先尋找本地是否有一樣的 Layer 可以使用,如果有,就會顯示 ---> Using cache,如下圖所示。而 Docker 判斷是否使用現有 Layer 的依據是寫在 Dockerfile 裡的指令,只要長的一樣就會採用,舉個例子:RUN apt-get update,即便每一次執行這行指令的結果不一定一樣,但因為指令長的一樣,預設就會採用現有的 Layer。

使用現有的 Layer 可以使建立新 Image 的速度快非常多!原本可以喝口咖啡+上個廁所+滑個手機,現在喝半口咖啡就建立完成了......,如果不想使用 Cache 的話,可以在建立時加上參數 --no-cache 喔!

留言

這個網誌中的熱門文章

程式語言常用之符號與詞彙 - 中英文對照

Repo 實用指令

什麼是 Bootloader?