以下是分析 Docker 磁盤占用的詳細步驟和工具指南,幫助開發者快速定位和清理冗余數據:
1. 查看 Docker 磁盤使用概覽
docker system df
輸出說明:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 15 10 5.2GB 1.1GB (21%)
Containers 12 5 1.3GB 800MB (61%)
Local Volumes 7 3 2.5GB 1.8GB (72%)
Build Cache 45 0 3.7GB 3.7GB (100%)
各部分含義解析
1)Images(鏡像)
- TOTAL:系統中存在的鏡像總數(包括中間層鏡像)。
- ACTIVE:當前被容器使用的鏡像數量。
- SIZE:所有鏡像占用的總磁盤空間。
- RECLAIMABLE:可回收的鏡像空間(未被任何容器使用的鏡像)。示例:1.234GB(52%)表示可以通過?
docker image prune
?釋放 1.234GB,占總鏡像空間的 52%。
2)Containers(容器)
- TOTAL:系統中存在的容器總數(包括已停止的容器)。
- ACTIVE:當前正在運行的容器數量。
- SIZE:所有容器的可寫層占用的總空間(容器內文件的變更)。
- RECLAIMABLE:已停止容器的可寫層空間。示例:100.2MB(81%)表示可以通過?
docker container prune
?釋放 100.2MB。
3)Local Volumes(本地卷)
- TOTAL:系統中存在的本地卷總數。
- ACTIVE:當前被容器掛載的卷數量。
- SIZE:所有卷占用的總磁盤空間。
- RECLAIMABLE:未被任何容器使用的卷空間。示例:456.7MB(80%)表示可以通過?
docker volume prune
?釋放 456.7MB。
4)Build Cache(構建緩存)
- TOTAL:Docker 構建過程中創建的緩存層總數。
- ACTIVE:當前被新構建復用的緩存層數量。
- SIZE:所有構建緩存占用的總空間。
- RECLAIMABLE:未被使用的緩存空間(默認全部可回收)。示例:3.456GB(100%)表示可以通過?
docker builder prune
?釋放全部緩存。
2. 定位具體占用項
(1) 鏡像占用分析
# 列出所有鏡像(按大小排序)
docker images --format "{{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}" | sort -k 4 -h -r# 查看懸空鏡像(未被任何容器引用的中間層)
docker images --filter "dangling=true"
(2) 容器占用分析
# 列出所有容器(包括已停止的,顯示磁盤占用)
docker ps -a --size
輸出關鍵列:
-
SIZE
: 容器可寫層大小(增量修改)。 -
VIRTUAL SIZE
: 容器關聯鏡像的總大小。
(3) 數據卷占用分析
# 列出所有數據卷
docker volume ls# 查看數據卷詳情(包括掛載點和占用空間)
docker system df -v
(4) 構建緩存分析
# 查看構建緩存(包括未使用的中間層)
docker builder prune --dry-run
(5) 日志文件分析
# 查看容器日志文件占用(默認路徑)
sudo du -sh /var/lib/docker/containers/*/*-json.log# 查看單個容器的日志大小
docker logs <容器名> --since 1h | wc -c # 統計最近1小時的日志大小
3. 清理策略
(1) 清理未使用的鏡像
# 刪除懸空鏡像
docker image prune# 刪除未被容器引用的所有鏡像
docker image prune -a
(2) 清理停止的容器
# 刪除所有已停止的容器
docker container prune# 刪除指定條件的容器(如退出狀態為0的)
docker rm $(docker ps -aq --filter "status=exited")
(3) 清理數據卷
# 刪除未使用的數據卷
docker volume prune
(4) 清理構建緩存
# 刪除所有構建緩存
docker builder prune --all
(5) 清理日志文件
-
手動清理:
# 清空日志文件(不刪除文件) truncate -s 0 /var/lib/docker/containers/<容器ID>/*-json.log
-
自動輪轉:
在容器啟動時限制日志大小(docker run
?或?docker-compose.yml
):logging:driver: "json-file"options:max-size: "10m" # 單個日志文件最大10MBmax-file: "3" # 最多保留3個日志文件
4. 深度分析工具
(1) 可視化工具 -?dive
分析鏡像層內容,定位大文件:
# 安裝 dive
curl -sS https://webinstall.dev/dive | bash# 分析鏡像
dive <鏡像名>
(2) 目錄分析工具 -?ncdu
掃描 Docker 存儲目錄:
# 安裝 ncdu
sudo apt install ncdu# 分析 Docker 數據目錄
sudo ncdu /var/lib/docker
5. 預防磁盤占滿
(1) 配置 Docker 存儲驅動
編輯?/etc/docker/daemon.json
,限制存儲大小(適用于?devicemapper
?或?overlay2
):
{"storage-driver": "overlay2","storage-opts": ["overlay2.size=20G" # 限制存儲池大小]
}
(2) 監控告警
-
使用?
cAdvisor
?+?Prometheus
?+?Grafana
?監控 Docker 資源。 -
設置磁盤空間閾值告警(如超過 80% 觸發清理腳本)。
6. 常見問題
問題 1:/var/lib/docker
?占用過大
原因:鏡像層、日志或未清理的容器堆積。
解決:
# 清理所有未使用的 Docker 資源
docker system prune --all --volumes
問題 2:容器日志持續增長
原因:未配置日志輪轉或應用日志輸出過多。
解決:配置?max-size
?和?max-file
?參數,或改用非阻塞日志驅動(如?journald
)。
7. 注意事項
謹慎使用?-a
?標志:prune -a
?會刪除所有未使用的資源(如鏡像、緩存),可能導致后續構建或部署變慢。
監控關鍵資源:重點關注?Build Cache?的大小,尤其是頻繁進行 Docker 構建的環境。
生產環境慎用:在生產環境清理資源前,建議先備份重要數據,避免意外刪除。
總結
資源類型 | 占用位置 | 清理命令 |
---|---|---|
鏡像 | /var/lib/docker/image | docker image prune -a |
容器 | /var/lib/docker/containers | docker container prune |
數據卷 | /var/lib/docker/volumes | docker volume prune |
日志 | 容器日志文件 | 配置日志輪轉 |
通過定期檢查(如每周執行?docker system prune
)和合理配置,可有效控制 Docker 磁盤占用。