iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0

前言

昨天跟大家介紹了什麼是映像檔,原來映像檔就是由一層一層的映像層 (layer) 所堆疊而成。有人說他是千層蛋糕,有人說是堆積木,也有人說是漢堡,基本上都是在形容映像層的層層堆疊。

我們今天就來看看每個映像檔中的映像層,讓大家更能明白映像層的堆疊。

映像檔的黑歷史

標題聳動了點,也不是什麼不堪入目的東西,這裡我們會透過 history 指令,查看特定映像檔,每層映像層的資訊。

image history

> docker image history ruby:latest

IMAGE          CREATED      CREATED BY                                       SIZE      COMMENT
9b7bf37095d7   3 days ago   /bin/sh -c #(nop)  CMD ["irb"]                   0B
<missing>      3 days ago   /bin/sh -c mkdir -p "$GEM_HOME" && chmod 177…   0B
<missing>      3 days ago   /bin/sh -c #(nop)  ENV PATH=/usr/local/bundl…   0B
<missing>      3 days ago   /bin/sh -c #(nop)  ENV BUNDLE_SILENCE_ROOT_W…   0B
<missing>      3 days ago   /bin/sh -c #(nop)  ENV GEM_HOME=/usr/local/b…   0B
<missing>      3 days ago   /bin/sh -c set -eux;   savedAptMark="$(apt-m…   63.1MB
<missing>      3 days ago   /bin/sh -c #(nop)  ENV RUBY_DOWNLOAD_SHA256=…   0B
<missing>      3 days ago   /bin/sh -c #(nop)  ENV RUBY_VERSION=3.2.2        0B
<missing>      3 days ago   /bin/sh -c #(nop)  ENV RUBY_MAJOR=3.2            0B
<missing>      3 days ago   /bin/sh -c #(nop)  ENV LANG=C.UTF-8              0B
<missing>      3 days ago   /bin/sh -c set -eux;  mkdir -p /usr/local/et…   45B
<missing>      4 days ago   /bin/sh -c set -ex;  apt-get update;  apt-ge…   560MB
<missing>      4 days ago   /bin/sh -c apt-get update && apt-get install…   183MB
<missing>      4 days ago   /bin/sh -c set -eux;  apt-get update;  apt-g…   48.5MB
<missing>      4 days ago   /bin/sh -c #(nop)  CMD ["bash"]                  0B
<missing>      4 days ago   /bin/sh -c #(nop) ADD file:f9dd2b1cc0ba261ac…   139MB

這是查看 ruby:latest 這個映像檔的資訊,上面寫著這個映像檔是由哪些映像層 ( IMAGE ) 由下往上堆疊而成,簡單說明:

  • IMAGE 是映像層 ID
  • CREATED_BY 是製造這一層映像層的指令 (之後會在 Dockerfile 中解釋)
  • 是因為,並非所有的層都是在同一個 Repository,所以當我們從 Docker hub 把映像檔 pull 下來時,這些不在 Docker hub 的 Repository 的映像層就會顯示為
  • 為什麼有些容量是 0,有些不是?因為 0B 的映像層只是在執行某些指令,並無產生東西,有容量的層就代表該層有在產生檔案。

要怎麼看到被截斷的完整訊息?

在 CREATED_BY 欄位的資料,都因為資訊過多過長,導致被截斷了。如果想要看完整的內容,可以使用 --no-trunc 讓所有欄位的資訊都顯示完整資訊:

> docker image history ruby:latest --no-trunc 

這時你會發現,因為所有訊息都顯示出來,導致版面很歪…

別擔心,我們可以用 --format 只顯示我們想要的特定欄位:

> docker image history ruby:latest --format "{{.CreatedBy}}" --no-trunc

( 內容太多,就不貼了 )

--format 後面接的參數是 Go Template 的格式,再多示範一個:

> docker image history ruby --format "{{.ID}} => {{.Size}}" --no-trunc

sha256:9b7bf37095d74a4dc7f8c6deb21e600a540731f68c5da0f1ef5f4dfd1e23aeae => 0B
<missing> => 0B
.
.
略

總結

經過 image history 的展示,我想大家應該都對映像檔跟映像層之間的關係,更加緊密,更加熟悉了吧~

突然想到一個比喻,希望大家都有玩過 LF2。每個角色的技能都是一個映像檔,可以一直尻一直尻,就像容器一直建立一直建立。那技能 ( 映像檔 ) 通常都是透過多個按鍵 ( 映像層 ) 組合 ( 堆疊 )而成,像是冰人的抽冰劍,D 下 J,這個抽冰劍映像檔是由 D 下 J 三個層建立的。

好了,快離題了,明天我們會透過映像層慢慢把視野拉開到映像檔到容器,希望能讓大家更明白映像層、映像檔、容器,之間的構成關係。


上一篇
Day 16: 什麼是映像檔 Image
下一篇
Day 18: 從映像層到容器
系列文
淺嚐 Docker:新手莫慌、漫乘鯨魚30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言