2023 iT邦鐵人賽 Day 19 - 映像檔的指令

前言

這幾天經歷了顛頗又艱難的學習,今天我們來點輕鬆愉快的小菜,請大家放心地躺著看。

基本上指令都跟容器大同小異,所以在容器的關卡已經熟悉的話,這裡其實也不會太難,負擔會比偏概念的文章還要小很多很多。

下載映像檔

在這之前,我們都是透過容器的 create 或是 run ,讓 Docker 自己抓映像檔。這次我們要使用正牌的下載方法: pull

1
2
> docker image pull ruby:bullseye
映像檔:標籤

映像檔清單

我們一樣可以透過 ls 查看清單,跟容器不同的是,容器有分狀態,容器的 ls 是運作中的容器清單,而映像檔則沒有這樣分類,列出來的就是全部的映像檔:

1
2
3
4
5
> docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ruby bullseye ce1ad64086a7 3 days ago 843MB
httpd latest edc5e1e3a458 4 days ago 195MB
redis alpine 8b8f8a322bdc 4 days ago 38.5MB

刪除映像檔

在刪除容器時,我們有提到,運作中的容器不給刪,映像檔也一樣,咦?映像檔不是沒有什麼運作不運作的狀態嗎?

不錯,各位客官,映像檔沒有狀態,但映像檔的刪除會受到容器影響。

請各位自行挑一個自己中意的映像檔 create 出一個容器,然後試著刪除映像檔,我這裡用了 httpd create 出一個容器,只有 create 而已喔!還沒有運作喔!

1
2
3
> docker image rm httpd

Error response from daemon: conflict: unable to remove repository reference "httpd" (must force) - container 61bcef5fbbf3 is using its referenced image edc5e1e3a458

這時 Docker 吐給你錯誤訊息,很氣憤地告訴你:「還有容器在使用這個映像檔啦!」

因為容器的建立,從映像檔那邊將映像層複製過來使用,在容器管理的概念上,只要還有容器,那就代表還需要有映像檔,以維持容器調節的持續運作,所以我們必須把所有使用該映像檔的容器都刪光後,讓該映像檔懸空,我們才能刪除該映像檔。

1
2
3
4
5
6
7
8
9
> docker image rm httpd
Untagged: httpd:latest
Untagged: httpd@sha256:0adbefbee65176b93e4135f5c133072e2fb963187b00df565e6c73814894af5c
Deleted: sha256:edc5e1e3a458f49d3b4a01c18b5e5e77c67dd17fa2d1b1fd43c97edc5d7cb03f
Deleted: sha256:eedf868fee309b1ad16931632ded59ec10105fdab23843b61ea77e02f68c3235
Deleted: sha256:c7b9a93e5d80fb3e95ecfe112fff613d8a263ff3e22b003614729e35f6226163
Deleted: sha256:767e0dc9c939f459596d0035aa65b9abde0dd3a38ab77f28d50b5eec6e9d4bb1
Deleted: sha256:dabeea650f94129a12ce8750f0736d41931869a0bf2b8ec1af71b9cdd4955dda
Deleted: sha256:341de903723838835820feffc6ff0ab04ea7ffddd3886cd7e971a7156a62a45a

有沒有看到!在我們刪除映像檔時,他是一層一層的刪除映像層。他怎麼構成的就怎麼被刪除的。

霸道總裁?

人人都能成為映像檔眼中的霸道總裁,你若真想對他怎樣,他也會不吭一聲的讓你對他怎樣。

所以只要使出霸道總裁壁咚招式 -f ,即便映像檔已經有容器了,它還是得乖乖的聽你的話:

1
> docker image rm httpd -f

快刀斬亂麻!

沒錯!我們可以一鍵刪除所有沒有建立容器的映像檔們。

1
> docker image prune

總結

花了幾天介紹完映像檔,現在大家應該對 Docker 的概念與指令有些許程度的明瞭了。

明天我們來介紹一下映像檔的雲端倉庫 Docker hub。