Windows?Docker?Desktop磁盤空間清理步驟完全指南
問題描述
在 Windows 上運行 Docker Desktop 時,可能會發(fā)現(xiàn) docker_data.vhdx 文件占用了大量磁盤空間(例如接近 400GB)。這個文件是 Docker Desktop 使用 WSL 2 后端時,用于存儲所有 Docker 數(shù)據(jù)(鏡像、容器、卷、構(gòu)建緩存等)的虛擬硬盤文件。
問題根源:WSL 2 虛擬硬盤
當(dāng)您在 Windows 上啟用 WSL 2 功能并使用 Docker Desktop 時,它會創(chuàng)建一個或多個 Linux 發(fā)行版(如 docker-desktop, docker-desktop-data)在后臺運行。您的容器及其所有相關(guān)數(shù)據(jù)(包括層疊的文件系統(tǒng)、寫入的數(shù)據(jù)等)最終都存儲在這個名為 docker_data.vhdx 的虛擬硬盤中。
重要特性:這個文件會動態(tài)增長以適應(yīng)您的數(shù)據(jù),但默認(rèn)情況下,即使您刪除了 Docker 內(nèi)部的文件,它也不會自動縮小。這就是它變得如此巨大的原因。
解決方案(從推薦到高級)
請嚴(yán)格按照順序嘗試以下方法,并在操作前確保重要數(shù)據(jù)已備份。
方案一:使用 Docker Desktop 自帶清理(最簡單、最安全)
這是首選方法,因為它完全通過 Docker 的管理界面進行,最不容易出錯。
- 打開 Docker Desktop。
- 點擊右上角的 設(shè)置(Settings) 齒輪圖標(biāo)。
- 選擇左側(cè)的 Resources -> Advanced。
- 這里您可以調(diào)整磁盤映像的最大大小,但我們現(xiàn)在不調(diào)整,只是查看。記下當(dāng)前設(shè)置。
- 選擇左側(cè)的 Troubleshoot(或在某些版本中是 Diagnose & Feedback)。
- 您會看到幾個按鈕,點擊 Clean / Purge data。
- 警告:這會刪除所有 Docker 數(shù)據(jù),包括所有鏡像、容器、卷和網(wǎng)絡(luò)。您的容器和數(shù)據(jù)也會被銷毀!請確保您已從容器中 docker cp 出所有重要文件,或者這些文件已通過卷掛載到了 Windows 主機上。
更溫和的清理(推薦先試這個):
直接在 Docker Desktop 的 Dashboard 頁面,您可以看到所有正在運行和已停止的容器、本地鏡像、卷和構(gòu)建緩存。您可以手動選擇不需要的鏡像、容器(已退出的)和卷,然后逐個刪除。
方案二:使用 Docker 命令進行精細清理(推薦用于日常維護)
這個方法可以更有選擇性地清理,避免丟失所有數(shù)據(jù)。
打開 PowerShell 或 CMD(以管理員身份運行并非必須,但有時有權(quán)限更好)。
列出并刪除所有已停止的容器:
docker container prune
系統(tǒng)會詢問是否繼續(xù),輸入
y。刪除所有未被使用的鏡像(懸空鏡像):
docker image prune
刪除所有未被使用的鏡像(包括那些沒有標(biāo)簽的,更徹底):
docker image prune -a
注意:這可能會刪除您之后可能想重用的基礎(chǔ)鏡像。
刪除所有未被使用的卷(極其重要:卷通常用于存儲數(shù)據(jù)庫數(shù)據(jù)等持久化信息,請確認(rèn)卷中的數(shù)據(jù)已無用或已備份):
docker volume prune
一鍵清理所有未使用的對象(容器、網(wǎng)絡(luò)、鏡像(懸空)、構(gòu)建緩存):
docker system prune
最徹底的清理(包括所有未被使用的鏡像,不僅僅是懸空鏡像):
docker system prune -a --volumes
再次強調(diào):
--volumes參數(shù)會刪除所有未被容器引用的卷,使用前請三思!
完成以上命令后,Docker 內(nèi)部的數(shù)據(jù)已經(jīng)減少了,但 docker_data.vhdx 文件的大小很可能還沒有變化。
方案三:壓縮 VHDX 文件(核心步驟?。?/h3>
這是讓虛擬硬盤文件實際變小的關(guān)鍵。我們需要在 WSL 層面進行操作。
關(guān)閉 Docker Desktop:右鍵系統(tǒng)托盤區(qū)的 Docker 圖標(biāo),選擇 Quit Docker Desktop。確保它完全退出。
列出并關(guān)閉所有 WSL 發(fā)行版:
打開 PowerShell 或 CMD,執(zhí)行:wsl --list --verbose # 或簡寫 wsl -l -v
您會看到類似這樣的輸出:
NAME STATE VERSION * Ubuntu Running 2 docker-desktop Stopped 2 docker-desktop-data Stopped 2
強制終止所有 WSL 實例:
為了確保萬無一失,運行:wsl --terminate Ubuntu wsl --terminate docker-desktop wsl --terminate docker-desktop-data
再次運行
wsl -l -v,確保所有狀態(tài)都變?yōu)?Stopped。優(yōu)化(壓縮)VHDX 文件:
現(xiàn)在針對存儲數(shù)據(jù)的那個發(fā)行版(docker-desktop-data)進行操作:# 請將路徑替換為您的實際路徑,通常就在這里 # 注意:這是一個很長的單行命令 optimize-vhd -Path "C:\Users\<YourUserName>\AppData\Local\Docker\wsl\data\ext4.vhdx" -Mode full
如何找到路徑?
- 默認(rèn)路徑通常是
C:\Users\<你的用戶名>\AppData\Local\Docker\wsl\data\ext4.vhdx。 - 如果找不到,可以在文件資源管理器的地址欄輸入
%LOCALAPPDATA%\Docker\wsl\data直接進入。 - 您也可以直接在 PowerShell 中運行(如果優(yōu)化了錯誤的文件也沒關(guān)系,只是沒效果):
optimize-vhd -Path "$env:LOCALAPPDATA\Docker\wsl\data\ext4.vhdx" -Mode full
-Mode full是最徹底的壓縮模式,耗時也最長。
- 默認(rèn)路徑通常是
等待完成并重啟 Docker:
命令執(zhí)行成功后,您會發(fā)現(xiàn)ext4.vhdx文件的大小顯著減小了?,F(xiàn)在重新啟動 Docker Desktop,它應(yīng)該會正常啟動。
關(guān)于 WSL 發(fā)行版的說明
WSL 發(fā)行版類型
當(dāng)您運行 wsl -l -v 時,可能會看到類似以下輸出:
NAME STATE VERSION * Ubuntu Stopped 2 Ubuntu2 Stopped 2 docker-desktop Stopped 2 docker-desktop-data Stopped 2
1.Ubuntu和Ubuntu2
它們是什么?
這些是您自己手動安裝的獨立的 Linux 發(fā)行版子系統(tǒng)。您可能在 Microsoft Store 里搜索并安裝了 “Ubuntu” 或某個特定版本(如 Ubuntu 20.04 LTS),或者通過wsl --install -d Ubuntu命令安裝的。它們與 Docker Desktop 是完全獨立的兩個程序。刪除它們對 Docker Desktop 有影響嗎?
完全沒有影響。 Docker Desktop 的運行不依賴于您手動安裝的這些 WSL 發(fā)行版。它們只是在您的電腦上共存的另一個 Linux 環(huán)境。我能刪除它們嗎?
可以,而且如果您不再需要在這些獨立環(huán)境中工作,強烈建議刪除它們以節(jié)省磁盤空間。
刪除方法:# 注銷(刪除)指定的發(fā)行版 wsl --unregister Ubuntu wsl --unregister Ubuntu2
警告:執(zhí)行此命令會永久刪除該發(fā)行版內(nèi)的所有文件和數(shù)據(jù),且無法恢復(fù)。請確保您沒有重要的文件在里面。
2.docker-desktop和docker-desktop-data
它們是什么?(這是重點?。?/strong>
這兩個是 Docker Desktop for Windows 為了使用 WSL 2 后端而自動創(chuàng)建和管理的特殊發(fā)行版。docker-desktop:包含 Docker 引擎(守護進程dockerd)和與 WSL 集成相關(guān)的組件。它負責(zé)運行 Docker 服務(wù)本身。docker-desktop-data:這就是您之前看到的 400GBdocker_data.vhdx文件的宿主! 它專門用于存儲所有的 Docker 鏡像、容器層、卷(Volumes)和網(wǎng)絡(luò)配置等持久化數(shù)據(jù)。您的容器及其所有讀寫操作,最終都保存在這個發(fā)行版的空間里。
刪除它們對 Docker Desktop 有影響嗎?
有毀滅性的影響!- 刪除
docker-desktop:Docker Desktop 將無法啟動,因為運行它的核心服務(wù)沒了。 - 刪除
docker-desktop-data:您的所有 Docker 數(shù)據(jù)(所有鏡像、所有容器、所有卷里的數(shù)據(jù))將會被永久刪除! 這比在 Docker 內(nèi)部執(zhí)行docker system prune -a --volumes要徹底得多,是直接格式化整個數(shù)據(jù)倉庫。您的 400GB 文件會消失,但代價是里面的所有內(nèi)容都沒了。
- 刪除
我能刪除它們嗎?
絕對不要手動刪除它們! 您只能通過 Docker Desktop 的設(shè)置或我們之前討論的Purge Data功能來重置它們,這本質(zhì)上也是在受控環(huán)境下刪除和重建它們。
WSL 發(fā)行版刪除影響總結(jié)
| WSL 發(fā)行版名稱 | 來源 | 作用 | 是否可以刪除? | 刪除后果 |
|---|---|---|---|---|
| Ubuntu, Ubuntu2 | 用戶手動安裝 | 獨立的 Linux 工作環(huán)境 | 可以 | 僅丟失該獨立Linux系統(tǒng)內(nèi)的個人文件 |
| docker-desktop | Docker Desktop 自動創(chuàng)建 | 運行 Docker 引擎的核心服務(wù) | 絕對不可以 | Docker Desktop 無法啟動 |
| docker-desktop-data | Docker Desktop 自動創(chuàng)建 | 存儲所有 Docker 數(shù)據(jù)的虛擬硬盤 | 絕對不可以 | 所有 Docker 鏡像、容器、卷數(shù)據(jù)永久丟失 |
清理步驟建議總結(jié)
第一步:常規(guī)清理
- 使用 Docker Desktop 的 Dashboard 手動刪除不需要的容器、鏡像和卷
- 或使用命令行:
docker system prune(溫和)或docker system prune -a(徹底)
第二步:關(guān)閉 Docker 和 WSL
- 完全退出 Docker Desktop
- 使用
wsl --terminate確保所有 WSL 實例都已停止
第三步:壓縮 VHDX 文件
- 使用
optimize-vhd命令壓縮docker-desktop-data的虛擬硬盤文件 - 這是讓文件實際變小的關(guān)鍵步驟
- 使用
第四步:重啟 Docker Desktop
- 驗證 Docker 是否正常工作
- 檢查磁盤空間是否已釋放
未來預(yù)防措施
定期清理:養(yǎng)成定期使用
docker system prune -a(或更溫和的命令)的習(xí)慣。使用 .dockerignore:在構(gòu)建鏡像時,使用此文件排除不必要的文件和目錄(如
node_modules,.git),可以減小鏡像體積。多階段構(gòu)建:在 Dockerfile 中使用多階段構(gòu)建,只將最終需要的文件復(fù)制到最終鏡像中。
合理使用卷:將動態(tài)數(shù)據(jù)(如數(shù)據(jù)庫文件)放在卷中,便于管理和備份,也避免在容器內(nèi)產(chǎn)生大量垃圾文件。
考慮數(shù)據(jù)備份策略:對于重要的容器數(shù)據(jù),定期將其從容器中拷出或備份卷。
重要提醒
- 在執(zhí)行任何
sudo rm -rf或wsl --unregister命令前,請務(wù)必再三確認(rèn)路徑是否正確,刪除系統(tǒng)文件可能導(dǎo)致系統(tǒng)無法啟動。 - 對于不確定的文件,可以先移動到備份位置(如
/tmp),觀察一段時間沒問題后再徹底刪除。 - 在執(zhí)行
docker system prune -a --volumes前,請確保重要數(shù)據(jù)已備份。 - 絕對不要手動刪除 docker-desktop 和 docker-desktop-data 這兩個 WSL 發(fā)行版!
常用清理命令
根據(jù)docker system df的結(jié)果,選擇合適的命令進行清理。
| 命令 | 作用 | 備注 |
|---|---|---|
docker container prune | 刪除所有已停止的容器。 | 相對安全。 |
docker image prune | 刪除所有"懸空鏡像"(即沒有標(biāo)簽,且沒有被任何容器引用的鏡像層)。 | 相對安全。 |
docker image prune -a | 刪除所有未被容器引用的鏡像。 | 較為激進,可能需重新拉取基礎(chǔ)鏡像,請謹(jǐn)慎使用。 |
docker volume prune | 刪除所有未被容器引用的卷。 | 卷中的數(shù)據(jù)是持久化的,被刪除后可能丟失重要數(shù)據(jù),操作前務(wù)必確認(rèn)卷已無用或已備份。 |
docker builder prune | 清理構(gòu)建緩存。 | 對于有頻繁鏡像構(gòu)建需求的環(huán)境,可考慮保留部分緩存。 |
docker system prune -a --volumes | 執(zhí)行最徹底的清理,會刪除所有未使用的容器、網(wǎng)絡(luò)、鏡像和卷。 | 這是核武器級別的命令,請再三確認(rèn)所有重要數(shù)據(jù)都已妥善處理后再使用。 |
總結(jié)
到此這篇關(guān)于Windows Docker Desktop磁盤空間清理的文章就介紹到這了,更多相關(guān)Windows Docker Desktop磁盤空間清理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
搭建docker-nginx服務(wù),訪問nginx報錯403問題及解決
這篇文章主要介紹了搭建docker-nginx服務(wù),訪問nginx報錯403問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03
CentOS7 Nvidia Docker環(huán)境搭建
本篇文章主要介紹了CentOS7 Nvidia Docker環(huán)境搭建,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02
docker-compose實現(xiàn)wireshark對linux主機進行抓包
這篇文章主要為大家介紹了docker-compose實現(xiàn)wireshark對linux主機進行抓包腳本示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
Docker?link實現(xiàn)容器互聯(lián)的方式
通過link方式創(chuàng)建容器,然后我們可以使用被link容器的別名進行訪問。本文重點給大家介紹Docker?link實現(xiàn)容器互聯(lián)的方式,感興趣的朋友一起看看吧2021-12-12
Docker容器訪問宿主機Ollama服務(wù)配置詳細操作步驟
Ollama現(xiàn)在已經(jīng)支持Docker安裝,極大的簡化了服務(wù)器用戶部署難度,這篇文章主要介紹了Docker容器訪問宿主機Ollama服務(wù)配置詳細操作步驟,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-12-12
docker啟動elasticsearch時內(nèi)存不足問題及解決方法
這篇文章主要介紹了docker啟動elasticsearch時內(nèi)存不足問題,本文給大家分享安裝過程及解決方法,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07

