docker的image id和digest
既然你看到這篇文章,你肯定已經用過docker,并且pull過鏡像,是以下面這條指令你肯定不會陌生
有沒有注意過輸出内容裡的digest,知道它是什麼意思嗎?
你肯定還用過docker images指令,
你能說出輸出裡的image id表示的是什麼意思嗎?
如果你已經知道上面兩個問題的答案,現在可以關掉浏覽器了,這篇文章的内容對你來說太淺顯了。如果你回答不上來,沒關系,繼續看下去,馬上你就搞清楚這些問題。
由于docker1.10和registry 2.3對鏡像和manifest格式都有很大的變更,是以下面的内容都是基于docker1.10+和registry2.3+,不要留戀老版本,讓它随風去吧。
docker鏡像包含兩部分内容:一組有序的層(layer)和相應的建立容器時要用的參數構成。我們可以分别通過<code>docker history</code>和<code>docker inspect</code>這兩個指令檢視層和鏡像參數。
啟動一個容器之後,我們可以看到容器裡有一個完整的檔案系統,容器裡所有的檔案都來自構成鏡像的層。

每個層裡都存放的是相對于上一個層的檔案的變更,比如增加了幾個檔案,修改了幾個檔案,删除了幾個檔案等等。docker通過諸如aufs之類的技術,把所有的層挂載到同一個目錄上,形成了我們在容器裡看到的完整的目錄結構。
把層裡所有的檔案打包成一個tar,對它計算sha256sum,得到的就是層id(layerid)
docker1.10開始,layer裡隻包含檔案變更,不再包含配置資訊,所有的配置資訊都屬于鏡像。
pull分為兩步,第一步是下載下傳manifest。manifest裡包含了前面所說的配置檔案和層清單。我們可以模拟這個過程,下載下傳busybox的manifest檔案看看。
把上面的代碼儲存為<code>manifest.py</code>,執行<code>python manifest.py</code>,輸出如下
我特地輸出的響應頭的<code>docker-content-digest</code>,它的值是<code>sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6</code>,有沒有覺得眼熟?沒錯!本文最開始的docker pull輸出裡的digest就是這個值。這個值實際上是manifest内容的sha256sum。注意看manifest内容的config部分,你可以找到一個digest,這個值是不是也很眼熟,它就是<code>docker images</code>輸出的鏡像id,鏡像的id是鏡像配置檔案的sha256sum,我們可以用它繼續從registry上下載下傳鏡像配置檔案。