docker

docker的分層存儲

因爲鏡像包含操作系統完整的 root 文件系統,其體積往往是龐大的,因此在 Docker 設計時,就充分利用 Union FS 的技術,將其設計爲分層存儲的架構。
所以嚴格來說,鏡像並非是像一個 ISO 那樣的打包文件,鏡像只是一個虛擬的概念,其實際體現並非由一個文件組成,而是由一組文件系統組成,或者說,由多層文件系統聯合組成。鏡像構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在自己這一層。比如,刪除前一層文件的操作,實際不是真的刪除前一層的文件,而是僅在當前層標記爲該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。因此,在構建鏡像的時候,需要額外小心,每一層儘量只包含該層需要添加的東西,任何額外的東西應該在該層構建結束前清理掉。分層存儲的特徵還使得鏡像的複用、定製變的更爲容易。甚至可以用之前構建好的鏡像作爲基礎層,然後進一步添加新的層,以定製自己所需的內容,構建新的鏡像。

虛懸鏡像(dangling image)

即指下列這種鏡像:

<none> <none>

這個鏡像的出現是因爲,當docker build時,新舊鏡像同名,從而導致舊鏡像名稱被取消,從而出現倉庫名、標籤均爲空的鏡像。
通過如下命令顯示dangling鏡像:

docker image ls -f dangling=true

通過下列命令刪除dangling鏡像:

docker image prune

中間層鏡像

爲了加速鏡像構建、重複利用資源,Docker 會利用 中間層鏡像。所以在使用一段時間後,可能會看到一些依賴的中間層鏡像。默認的 docker image ls 列表中只會顯示頂層鏡像,如果希望顯示包括中間層鏡像在內的所有鏡像的話,需要加 -a 參數。

docker image ls -a

這樣會看到很多無標籤的鏡像,與之前的虛懸鏡像不同,這些無標籤的鏡像很多都是中間層鏡像,是其它鏡像所依賴的鏡像。這些無標籤鏡像不應該刪除,否則會導致上層鏡像因爲依賴丟失而出錯。實際上,這些鏡像也沒必要刪除,因爲之前說過,相同的層只會存一遍,而這些鏡像是別的鏡像的依賴,因此並不會因爲它們被列出來而多存了一份,無論如何你也會需要它們。只要刪除那些依賴它們的鏡像後,這些依賴的中間層鏡像也會被連帶刪除。

列出部分鏡像

不加任何參數的情況下,docker image ls 會列出所有頂級鏡像,但是有時候我們只希望列出部分鏡像。docker image ls有好幾個參數可以幫助做到這個事情。

  1. 根據倉庫名列出鏡像
docker image ls 鏡像名
  1. 列出特定的某個鏡像,也就是說指定倉庫名和標籤
docker image ls 鏡像名:標籤
  1. 除此以外,docker image ls 還支持強大的過濾器參數 --filter,或者簡寫 -f。之前我們已經看到了使用過濾器來列出虛懸鏡像的用法,它還有更多的用法。比如,我們希望看到在 mongo:3.2 之後建立的鏡像,可以用下面的命令:

此外,如果鏡像構建時,定義了 LABEL,還可以通過 LABEL 來過濾。

docker image ls -f label=com.example.version=0.1
  1. 以特定格式顯示
    默認情況下,docker image ls 會輸出一個完整的表格,但是我們並非所有時候都會需要這些內容,我們可以使用-q參數來列出鏡像id。
docker image ls -q

在上面介紹了--filter ,--filter-q配合可以得到指定範圍的ID列表, 然後送給另一個 docker 命令作爲參數,從而針對這組實體成批的進行某種操作的做法在 Docker 命令行使用過程中非常常見。
tips
顯示鏡像摘要:```
docker image ls --digests


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章