Docker占用的巨大磁盤空間的清理方法
我相信很多人在使用 Docker 一段時間后,都會遇到一個常見問題:磁盤空間被迅速吃光,尤其是在進行頻繁的鏡像構(gòu)建、測試和運行容器時。以我自己為例,在 Ubuntu 24.04設(shè)備上,docker system df -v 一看,Docker 已經(jīng)占用了 700G+,如下圖。其中光是 build cache 就達到了 552G。這種情況并不少見。本文會介紹 Docker 為什么會占用這么多空間,以及如何一步步地清理。

一、為什么 Docker 會占用這么多空間
Docker 的設(shè)計原理決定了它會不斷產(chǎn)生緩存和中間數(shù)據(jù)。主要來源有以下幾類:
- 鏡像層
每次docker build都會把Dockerfile的指令拆分成一層一層的鏡像。如果你頻繁修改 Dockerfile 或者構(gòu)建不同版本的鏡像,就會產(chǎn)生很多舊層。 - 構(gòu)建緩存(Build Cache)
Docker 默認(rèn)會緩存中間步驟,以加快下一次構(gòu)建。例如第一次apt-get update的結(jié)果會被緩存,第二次構(gòu)建就直接復(fù)用。但隨著時間推移,這些緩存越來越多,磁盤就被“吃掉”。 - 容器
容器刪除不及時會保留磁盤空間,尤其是已停止的容器。 - 卷(Volumes)
數(shù)據(jù)卷用于持久化數(shù)據(jù)庫、日志等內(nèi)容。如果你經(jīng)常測試數(shù)據(jù)庫鏡像(比如 MySQL、Postgres),卷很容易膨脹到幾十個 G。 - 網(wǎng)絡(luò)
Docker 會為容器分配網(wǎng)絡(luò),雖然占用空間不大,但如果創(chuàng)建過多也會留下無用配置。
二、先看看空間到底去哪了
第一步是確認(rèn)哪些部分占用最大。
docker system df -v
它的結(jié)構(gòu)是這樣的:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 120 5 80.5GB 70GB (87%) Containers 15 2 5.3GB 4GB (75%) Local Volumes 30 10 62GB 40GB (64%) Build Cache 300 552.7GB 552.7GB
但實際上我們每個項可能都非常多,比如我的光Image這項就一頁看不到頭。

可以看到項目非常多,我們大致往下劃一下,看到,build cache 是最大的“罪魁禍?zhǔn)?rdquo;。

當(dāng)然每個人情況可能不一樣,但是cache通常都是罪魁禍?zhǔn)?,找打了原因,如何清理呢?/p>
三、如何清理
1. 清理構(gòu)建緩存
構(gòu)建緩存往往占用空間最多。
# 刪除未使用的構(gòu)建緩存 docker builder prune # 更徹底,刪除所有緩存,包括可能還會用到的 docker builder prune --all
舉個例子:如果你構(gòu)建了 100 個不同版本的鏡像,每次 Dockerfile 都有 apt-get update,這些中間結(jié)果會一直留在緩存里。執(zhí)行 docker builder prune --all 后,這些緩存會被清理掉,立刻釋放出上百 G。缺點是下次構(gòu)建會變慢,因為緩存沒了。
2. 清理沒用的容器
已停止的容器(狀態(tài) Exited)通常沒有意義,可以直接刪掉。
docker container prune
如果你想更謹(jǐn)慎,可以先查看:
docker ps -a
例如:
CONTAINER ID IMAGE STATUS abcd1234 ubuntu Exited (0) 2 weeks ago efgh5678 nginx Exited (137) 3 days ago
這些容器通常就是“殘骸”。
3. 清理懸空鏡像
所謂懸空鏡像,是指 tag 為 <none> 的鏡像,它們是被新鏡像替換后的舊版本。
查看:
docker images -f dangling=true
清理:
docker image prune
例如你頻繁用 docker build .,每次都會產(chǎn)生一個新鏡像,舊的就變成 <none>。
4. 清理沒用的卷
卷是最容易“暗中膨脹”的地方,特別是數(shù)據(jù)庫。
查看:
docker volume ls -f dangling=true
清理:
docker volume prune
比如你測試過幾次 MySQL,每次都掛載了一個 volume,哪怕容器刪了,數(shù)據(jù)卷也可能還在,幾十 G 的數(shù)據(jù)就這么堆積下來。
5. 清理沒用的網(wǎng)絡(luò)
查看:
docker network ls
清理:
docker network prune
雖然網(wǎng)絡(luò)占用空間不大,但保持干凈是好習(xí)慣。
四、一鍵清理
如果你只是做實驗,對數(shù)據(jù)不敏感,可以直接:
docker system prune -a --volumes
這會刪除所有:
- 已停止的容器
- 沒有 tag 的鏡像
- 沒用的卷
- 沒用的網(wǎng)絡(luò)
- 構(gòu)建緩存
空間釋放得最快,但要注意數(shù)據(jù)卷和緩存一旦清理,就無法恢復(fù)。
五、更深入的檢查
有時候你清理完,空間還是很大,可以直接查看 /var/lib/docker 下哪些目錄占用:
sudo du -h --max-depth=1 /var/lib/docker | sort -h
常見大戶:
overlay2/:鏡像和容器的文件系統(tǒng)volumes/:卷的數(shù)據(jù)buildkit/:構(gòu)建緩存
如果 buildkit 特別大,就說明問題出在構(gòu)建緩存。
六、后續(xù)優(yōu)化建議
- 定期清理
可以加一個定時任務(wù),每個月執(zhí)行一次docker builder prune --all和docker volume prune。 - 精簡 Dockerfile
減少無意義的構(gòu)建層,比如把多個RUN合并,減少緩存堆積。 - 單獨掛載
/var/lib/docker
如果 Docker 用得多,可以把/var/lib/docker放到一個大磁盤分區(qū),避免根分區(qū)被塞滿。
七、總結(jié)
Docker 占用空間大的原因,往往是 build cache、卷和鏡像殘留。清理的核心命令就是:
docker builder prune --all清理構(gòu)建緩存docker container prune清理沒用的容器docker image prune清理懸空鏡像docker volume prune清理沒用的卷docker network prune清理沒用的網(wǎng)絡(luò)docker system prune -a --volumes一鍵清理
清理完成之后,占用空間明顯減少:

以上就是Docker占用的巨大磁盤空間的清理方法的詳細(xì)內(nèi)容,更多關(guān)于Docker占用磁盤空間清理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Docker自定義JDK鏡像并拉取至阿里云鏡像倉庫超詳細(xì)攻略
Docker倉庫是集中存放鏡像的地方,分為公共倉庫和私有倉庫,這篇文章主要給大家介紹了關(guān)于Docker自定義JDK鏡像并拉取至阿里云鏡像倉庫的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08
nerdctl替代docker及docker-compose的安裝使用
這篇文章主要為大家介紹了nerdctl替代docker及docker-compose的安裝使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06
詳解MAC OSX Docker開發(fā)環(huán)境搭建
本篇文章主要介紹了詳解MAC OSX Docker開發(fā)環(huán)境搭建,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03
Docker容器化spring boot應(yīng)用詳解
本篇文章主要介紹了Docker容器化spring boot應(yīng)用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04
docker配置skywalking 監(jiān)控springcloud應(yīng)用的詳細(xì)步驟
本文分步驟給大家講解docker配置skywalking 監(jiān)控springcloud應(yīng)用的方法,感興趣的朋友一起看看吧2025-04-04
Docker下多容器搭建 lamp的詳細(xì)過程(httpd+mysql+php+redis)
這篇文章主要介紹了Docker下多容器搭建lamp的詳細(xì)過程(httpd+mysql+php+redis),搭建拉取所需鏡像,本文給大家講解的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-01-01

