4.2 列出映象
在下載了映象後,我們可以使用 docker image ls 指令列出本地主機上的映象。
4.2.1 基本用法
檢視本地已下載的映象:
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 5f515359c7f8 5 days ago 183MB
nginx latest 05a60462f8ba 5 days ago 181MB
ubuntu 24.04 329ed837d508 3 days ago 78MB
ubuntu noble 329ed837d508 3 days ago 78MB
💡
docker images是docker image ls的簡寫,兩者等效。
4.2.2 輸出欄位說明
docker image ls 指令預設輸出的清單包含倉庫名、標籤、映象 ID、建立時間和佔用空間等訊息。
| 欄位 | 說明 |
|---|---|
| REPOSITORY | 倉庫名 |
| TAG | 標籤 (版本) |
| IMAGE ID | 映象唯一標識 (短 ID,前 12 位) |
| CREATED | 建立時間 |
| SIZE | 本地佔用空間 |
同一映象多個標籤
注意上面的 ubuntu:24.04 和 ubuntu:noble 擁有相同的 IMAGE ID——它們是同一個映象的不同標籤,只佔用一份儲存空間。
版本說明:
ubuntu:24.04是具體版本號,ubuntu:noble是發布代號(Ubuntu 24.04 的代號)。在 Dockerfile 中應優先使用版本號(如ubuntu:24.04)而非發布代號,因為版本號在將來更易理解。
4.2.3 理解映象大小
Docker 映象的大小可能與我們通常理解的檔案大小有所不同,這涉及到分層儲存的概念。
本地大小 vs Hub 顯示大小
| 位置 | 顯示大小 | 說明 |
|---|---|---|
| Docker Hub | 29MB | 壓縮後的網路傳輸大小 |
| docker image ls | 78MB | 本地解壓後的實際大小 |
實際磁碟佔用
由於映象是分層儲存,不同映象可能共享相同的層:
ubuntu:24.04 nginx:latest redis:latest
│ │ │
└───────┬───────┘ │
▼ │
共享基礎層 ◄───────────────────┘
因此,docker image ls 中各映象大小之和 > 實際磁碟佔用。
檢視實際空間佔用
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 15 3 2.5GB 1.8GB (72%)
Containers 5 2 100MB 80MB (80%)
Local Volumes 8 2 500MB 400MB (80%)
Build Cache 0 0 0B 0B
4.2.4 過濾映象
隨著本地映象數量的增加,我們需要更有效的方式來查詢特定的映象。Docker 提供了多種過濾方式。
按倉庫名過濾
## 列出所有 ubuntu 映象
$ docker images ubuntu
REPOSITORY TAG IMAGE ID SIZE
ubuntu 24.04 329ed837d508 78MB
ubuntu noble 329ed837d508 78MB
ubuntu 22.04 a1b2c3d4e5f6 72MB
按倉庫名和標籤過濾
$ docker images ubuntu:24.04
REPOSITORY TAG IMAGE ID SIZE
ubuntu 24.04 329ed837d508 78MB
使用過濾器 --filter
| 過濾條件 | 說明 | 範例 |
|---|---|---|
dangling=true |
虛懸映象 | -f dangling=true |
before=映象 |
在某映象之前建立 | -f before=nginx:latest |
since=映象 |
在某映象之後建立 | -f since=nginx:latest |
label=key=value |
按 LABEL 過濾 | -f label=version=1.0 |
reference=pattern |
按名稱模式 | -f reference='*:latest' |
## 列出 nginx 之後建立的映象
$ docker images -f since=nginx:latest
## 列出所有帶 latest 標籤的映象
$ docker images -f reference='*:latest'
## 列出帶特定 LABEL 的映象
$ docker images -f label=maintainer=example@email.com
4.2.5 虛懸映象
在映象清單裡,你可能會看到一些倉庫名和標籤都為 <none> 的映象,這類映象被稱為虛懸映象。
什麼是虛懸映象
倉庫名和標籤都顯示為 <none> 的映象:
$ docker images
REPOSITORY TAG IMAGE ID SIZE
<none> <none> 00285df0df87 342MB
產生原因
- 映象重新建立:新映象使用了舊映象的標籤,舊映象標籤被移除
- docker pull 更新:拉取更新版本時,舊版本失去標籤
處理虛懸映象
## 列出虛懸映象
$ docker images -f dangling=true
## 刪除虛懸映象
$ docker image prune
4.2.6 中間層映象
除了虛懸映象,docker image ls 預設列出的只是頂層映象。還有一種映象是為了加速映象建立、重複利用資源而存在的中間層映象。
檢視所有映象:包含中間層
$ docker images -a
會顯示很多無標籤映象——這些是建立過程中產生的中間層,被其他映象依賴。
⚠️ 不要刪除中間層映象。它們是其他映象的依賴,刪除會導致上層映象無法使用。刪除頂層映象時會自動清理不再需要的中間層。
4.2.7 格式化輸出
為了配合指令碼使用或展示更關注的訊息,我們可以使用 --format 引數來自定義輸出格式。
只輸出 ID
$ docker images -q
5f515359c7f8
05a60462f8ba
329ed837d508
常用於配合其他指令:
## 刪除所有映象
$ docker rmi $(docker images -q)
## 刪除所有 redis 映象
$ docker rmi $(docker images -q redis)
顯示完整 ID
$ docker images --no-trunc
顯示摘要
$ docker images --digests
REPOSITORY TAG DIGEST IMAGE ID
nginx latest sha256:b4f0e0bdeb5... e43d811ce2f4
自定義格式
使用 Go 樣板語法自定義輸出:
## 只顯示 ID 和倉庫名
$ docker images --format "{{.ID}}: {{.Repository}}"
5f515359c7f8: redis
05a60462f8ba: nginx
329ed837d508: ubuntu
## 表格形式(帶標題)
$ docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
REPOSITORY TAG SIZE
redis latest 183MB
nginx latest 181MB
ubuntu 24.04 78MB
可用樣板欄位
| 欄位 | 說明 |
|---|---|
.ID |
映象 ID |
.Repository |
倉庫名 |
.Tag |
標籤 |
.Digest |
摘要 |
.CreatedSince |
建立後經過的時間 |
.CreatedAt |
建立時間 |
.Size |
大小 |
4.2.8 常用指令組合
## 列出所有映象及其大小,按大小排序(需要系統 sort 指令)
$ docker images --format "{{.Size}}\t{{.Repository}}:{{.Tag}}" | sort -h
## 查詢大於 500MB 的映象
$ docker images --format "{{.Size}}\t{{.Repository}}:{{.Tag}}" | grep -E "^[0-9]+GB|^[5-9][0-9]{2}MB"
## 匯出映象清單
$ docker images --format "{{.Repository}}:{{.Tag}}" > images.txt