Docker 資源清理指令彙整
這份文件說明如何在 Docker 中移除不必要的資源(如未使用的容器、映像檔、網路、資料卷等),以釋放磁碟空間,並提供常用清理指令與注意事項。
查看目前使用空間
在清理前,先確認目前的磁碟使用狀況:
docker system df輸出範例:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 12 3 2.45GB 1.87GB (76%)
Containers 5 2 128MB 96MB (75%)
Local Volumes 8 2 512MB 384MB (75%)
Build Cache 24 0 890MB 890MB| 欄位 | 說明 |
|---|---|
| TYPE | 資源類型(映像檔、容器、資料卷、Build Cache) |
| TOTAL | 該類型的總數量 |
| ACTIVE | 目前正在使用中的數量 |
| SIZE | 佔用的磁碟空間 |
| RECLAIMABLE | 可回收(清理後可釋放)的空間 |
加上 -v 可查看每個資源的詳細資訊:
docker system df -v一鍵清除所有未使用資源
清除下列資源:
- 停止的容器
- 未使用的網路
- 沒有被任何容器使用的映像檔
- 建立時產生的中間暫存層
docker system prune執行後會先顯示確認提示:
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all dangling build cache
Are you sure you want to continue? [y/N]加上 --force 可略過確認提示,適合在自動化腳本中使用:
docker system prune --force加上 --volumes 同時清除未使用的資料卷(預設不清除):
docker system prune --volumes注意
--volumes 會一併移除未被任何容器掛載的資料卷,請確認資料卷內無重要資料再執行。
更徹底加上 -a,額外刪除所有未使用的映像檔(包括已經建構但未被執行的):
docker system prune -a注意
此指令會移除所有未被任何容器使用的映像檔,請確認無需保留再執行。
移除已停止的容器
容器在 docker stop 或程式執行完畢後進入「已停止(Exited)」狀態,不會自動刪除,久了會累積佔用空間。
先用以下指令確認哪些容器處於停止狀態:
docker ps -a輸出範例(STATUS 為 Exited 的即為已停止):
CONTAINER ID IMAGE COMMAND STATUS NAMES
a1b2c3d4e5f6 nginx "/docker…" Exited (0) 2 days ago web-old
f6e5d4c3b2a1 postgres:14 "docker…" Up 3 hours db確認無誤後,移除所有已停止的容器:
docker container prune加上 --force 略過確認提示:
docker container prune --force提醒
正在執行(Up)的容器不會受此指令影響。
移除未使用的映像檔
懸掛映像檔(dangling image)
懸掛映像檔是指沒有標籤(tag)且未被任何容器使用的映像檔,通常由重複 docker build 後產生。每次重新建構同一個 tag 的映像檔,舊的映像層就會失去 tag 成為懸掛映像檔。
移除懸掛映像檔:
docker image prune加上 -a 可刪除所有未被任何容器使用的映像檔(包含有 tag 但未被使用的):
docker image prune -a注意
-a 參數會移除所有未被任何容器使用的映像檔,請確認無需保留再執行。
使用 --filter 只移除特定條件的映像檔,例如移除 24 小時前建立的:
docker image prune -a --filter "until=24h"也可以指定更長的時間範圍,例如 7 天前:
docker image prune -a --filter "until=168h"移除未使用的網路
移除所有未被任何容器使用的自訂網路:
docker network prune提醒
以下三個 Docker 內建預設網路不受此指令影響,永遠不會被移除:
bridge:容器預設使用的橋接網路host:直接使用宿主機網路none:完全隔離,無網路
移除未使用的資料卷
警告
資料卷(Volume)通常用於儲存持久化資料,例如資料庫的資料檔案。移除後無法恢復,請務必謹慎操作。
先確認目前存在哪些資料卷及其使用狀況:
docker volume ls輸出範例:
DRIVER VOLUME NAME
local mysql_data
local redis_data
local my-project_uploads確認哪些資料卷真的沒有在使用後,再移除未被任何容器掛載的資料卷:
docker volume prune