docker容器臨時文件去除,服務(wù)器容量空間詳解
概述
接到告警提醒,服務(wù)器容量不足,去查看了一下,發(fā)現(xiàn)確實(shí)100g左右容量已基本用完;

分析
1、查看根目錄下哪些文件夾占用容量較大
使用命令“ du -ah --max-depth=1 / ” 查看目標(biāo)目錄下所有文件夾的容量:

可以看到目錄 /var 下面占用了很大的容量,繼續(xù)使用命令查看“du -ah --max-depth=1 /var”:

繼續(xù)跟進(jìn)lib目錄“du -ah --max-depth=1 /var/lib”:

繼續(xù)下鉆“du -ah --max-depth=1 /var/lib/docker/”:

2、看到這里發(fā)現(xiàn)/var/lib/docker/overlay2 下的容量非常大
在 Linux 系統(tǒng)中,/var/lib/docker/overlay2 是 Docker 容器引擎使用 overlay2 存儲驅(qū)動 時的核心數(shù)據(jù)存儲目錄,主要用于管理 Docker 鏡像和容器的文件系統(tǒng)分層數(shù)據(jù)。
具體作用:
Docker 采用 分層存儲機(jī)制(類似 “棧” 的結(jié)構(gòu)),而 overlay2 是 Docker 推薦的存儲驅(qū)動之一(基于 Linux 內(nèi)核的 overlayfs 技術(shù)),/var/lib/docker/overlay2 正是這種機(jī)制的實(shí)際數(shù)據(jù)存放位置,主要包含:
1、 鏡像層(Image Layers):
- Docker 鏡像由多個只讀層(Layer)組成(例如基礎(chǔ)系統(tǒng)層、依賴庫層、應(yīng)用層等),這些層的實(shí)際文件數(shù)據(jù)就存儲在該目錄下。
- 多個鏡像可能共享相同的基礎(chǔ)層,從而節(jié)省空間。
2、容器讀寫層(Container Layers):
當(dāng)容器啟動時,Docker 會在鏡像只讀層之上添加一個 可寫層(用于容器運(yùn)行時的文件修改、新增、刪除等操作),這部分臨時數(shù)據(jù)也存儲在 overlay2 目錄中。
容器停止后,可寫層不會自動刪除(除非手動清理)。
元數(shù)據(jù):
3、記錄各層的關(guān)聯(lián)關(guān)系、校驗(yàn)信息等,確保 Docker 能正確組裝鏡像和容器的文件系統(tǒng)。
為什么這個目錄會很大?
- 長期使用 Docker 后,未清理的 舊鏡像、停止的容器(及其可寫層)、未使用的臨時層 會不斷累積,導(dǎo)致目錄占用空間增大。
- 容器運(yùn)行過程中產(chǎn)生的日志、臨時文件、緩存等也可能存放在可寫層中,進(jìn)一步占用空間。
如何清理空間?
如果該目錄占用過大,可以通過 Docker 自帶的命令安全清理(操作前建議確認(rèn)不需要的資源):
清理所有未使用的資源(停止的容器、未被引用的鏡像、懸空鏡像、未使用的卷等):
本次操作就是用下面的這個命令:
bash docker system prune -a --volumes
- -a:刪除所有未被容器引用的鏡像(包括未打標(biāo)簽的 “懸空鏡像”)。
- –volumes:同時清理未被使用的數(shù)據(jù)卷(謹(jǐn)慎使用,確保卷中無重要數(shù)據(jù))。
單獨(dú)清理無用鏡像:
bash docker image prune -a
單獨(dú)清理停止的容器:
bash docker container prune
注意:
不要直接手動刪除 overlay2 目錄下的文件(可能導(dǎo)致 Docker 數(shù)據(jù)損壞,容器 / 鏡像無法正常使用)。
清理前確保重要容器已停止或備份,避免誤刪正在使用的資源。
通過以上操作,通常能顯著減少 overlay2 目錄的占用空間。
3)執(zhí)行完以上操作發(fā)現(xiàn)容量還是比較大

繼續(xù)使用“du -ah --max-depth=1 /var/lib/docker/overlay2/”查看目錄的大?。?/p>

發(fā)現(xiàn)紅框這個文件非常大,所以就看這個地方:
911d4b0c8e6ef3ad8cad514279b0b0ba28bb6c6a32cac154aba1d4a703c85836 的子目錄占用(43G),其他目錄占用空間較小。下面具體解釋并提供處理思路:
這些哈希命名的目錄是什么?
overlay2 目錄下的子目錄名稱是隨機(jī)哈希值,每個目錄對應(yīng) Docker 的一個 存儲層(可能是鏡像的只讀層,或容器的可寫層):
- 帶 -init 后綴的目錄(如 16fd4ddd…-init)通常是容器初始化時的臨時層,空間很小。
- 其他無后綴的目錄是常規(guī)的鏡像層或容器運(yùn)行時的可寫層。
你看到的 911d4b0c8e6ef3ad8cad514279b0b0ba28bb6c6a32cac154aba1d4a703c85836 就是一個占用大量空間的層(極可能是某個容器的可寫層,因?yàn)殓R像層通常不會單獨(dú)這么大,且多個鏡像會共享層)。
如何找到這個大目錄對應(yīng)的容器 / 鏡像?
要確定這個 43G 的層屬于哪個容器或鏡像,需要通過 Docker 的元數(shù)據(jù)關(guān)聯(lián)。步驟如下:
查看所有容器的存儲層信息:
運(yùn)行以下命令,查找哪個容器的 GraphDriver.Data.MergedDir 或 UpperDir 包含這個哈希目錄:
bash docker inspect $(docker ps -aq) | grep -B 10 "911d4b0c8e6ef3ad8cad514279b0b0ba28bb6c6a32cac154aba1d4a703c85836"
輸出中會顯示容器的 Name 或 Id,說明這個層是該容器的可寫層(容器運(yùn)行時產(chǎn)生的文件都存在這里)。
如果不是容器,再檢查鏡像:
若上述命令沒結(jié)果,可能是某個鏡像的層(較少見,因?yàn)殓R像層通常被共享),可通過鏡像元數(shù)據(jù)查找:
bash docker inspect $(docker images -q) | grep -B 10 "911d4b0c8e6ef3ad8cad514279b0b0ba28bb6c6a32cac154aba1d4a703c85836"
執(zhí)行命令:

docker inspect 結(jié)果來看,這個 43G 的大目錄 911d4b0c8e6ef3ad8cad514279b0b0ba28bb6c6a32cac154aba1d4a703c85836 明確屬于某個容器的 可寫層(UpperDir 指向該目錄,這是容器運(yùn)行時寫入數(shù)據(jù)的位置)。
第一步:找到這個容器的具體信息(ID / 名稱)
你的 docker inspect 輸出只顯示了部分細(xì)節(jié),需要進(jìn)一步定位對應(yīng)的容器。可以用以下命令直接找到該容器的 ID 和名稱:
bash
# 遍歷所有容器,找到包含該哈希的容器,并輸出其ID和名稱
for container in $(docker ps -aq); do
if docker inspect $container | grep -q "911d4b0c8e6ef3ad8cad514279b0b0ba28bb6c6a32cac154aba1d4a703c85836"; then
echo "容器ID: $container"
docker inspect --format '{{.Name}}' $container # 輸出容器名稱
fi
done
運(yùn)行后會得到類似結(jié)果(示例):
plaintext 容器ID: abc123456 /nginx-app # 容器名稱
第二步:分析容器內(nèi)的大文件來源
確定容器后,需要進(jìn)入容器內(nèi)部,查看哪些文件占用了大量空間:
- 先檢查容器狀態(tài)(是否在運(yùn)行):
bash docker ps | grep 容器ID/名稱 # 若有輸出,說明正在運(yùn)行;否則是已停止
- 進(jìn)入容器內(nèi)部查找大文件:
bash # 若容器運(yùn)行中,直接進(jìn)入 docker exec -it 容器ID/名稱 /bin/bash # 查看目錄下最大的20個文件 du -a / 2>/dev/null | sort -nr | head -n 20
絕對不要手動刪除 overlay2 目錄下的文件,否則可能導(dǎo)致 Docker 數(shù)據(jù)損壞。

可以發(fā)現(xiàn)/tmp 容量河大有22g; 進(jìn)入該目錄看有什么文件:

查看該目錄下最大的20個文件:

刪除文件
rm -f /tmp/+~JF*.tmp
# 示例:刪除7天前的日志(假設(shè)日志按日期命名,如 sys-console.2025-08-05.log) find /juzi/server/logs -name "*.log" -mtime +7 -delete
注意事項(xiàng)
清理文件時,確保不刪除應(yīng)用運(yùn)行必需的臨時文件(如正在使用的緩存),必要時先暫停應(yīng)用再清理。
操作后建議重啟容器,確??臻g釋放生效(docker restart 容器ID)。
通過以上步驟,可顯著減少容器占用的空間,并避免未來再次出現(xiàn)類似問題。
從文件路徑(/tmp 臨時目錄)和命名格式(+~JF 開頭的 .tmp 文件)來看,這些文件大概率是辦公軟件(如 LibreOffice、OpenOffice 等)在編輯文檔時生成的臨時備份文件。
具體說明:
- 臨時備份文件的作用
LibreOffice、OpenOffice 等辦公軟件在編輯文檔(如 Word 文檔、Excel 表格等)時,會自動創(chuàng)建臨時文件,用于:
實(shí)時保存用戶的編輯內(nèi)容,防止程序崩潰、意外關(guān)閉時丟失數(shù)據(jù);
作為文檔的臨時緩存,提升編輯時的響應(yīng)速度。
這類文件的命名通常包含隨機(jī)字符(如這里的 JF 后接一串?dāng)?shù)字),并以 .tmp 為后綴,存放于系統(tǒng)臨時目錄(/tmp)。
- 為何會殘留?
正常情況下,當(dāng)你關(guān)閉辦公軟件或保存文檔后,這些臨時文件會被自動刪除。但如果程序異常退出(如強(qiáng)制關(guān)閉、崩潰),臨時文件可能來不及清理,就會殘留在 /tmp 目錄中。
關(guān)于 ip2region.xdb
這個文件是一個IP 地址定位數(shù)據(jù)庫(ip2region 是一個常用的開源 IP 庫),用于將 IP 地址解析為具體的地理位置(如國家、城市等)。
很多應(yīng)用程序(如日志分析工具、后臺服務(wù))可能會臨時使用這個庫文件,用完后可能留在 /tmp 目錄。
- 處理建議:
如果確認(rèn)近期沒有正在編輯的辦公文檔,這些 +~JF*.tmp 文件可以安全刪除(避免占用磁盤空間);
ip2region.xdb 若暫時不用,也可刪除,后續(xù)有程序需要時會重新生成或下載。
刪除命令(謹(jǐn)慎操作,確保不再需要):
bash rm -f /tmp/+~JF*.tmp /tmp/ip2region.xdb
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Windows下運(yùn)用Docker部署Node.js開發(fā)環(huán)境
這篇文章主要介紹了詳解Windows下運(yùn)用Docker部署Node.js開發(fā)環(huán)境,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01
詳解使用Docker部署MySQL(數(shù)據(jù)持久化)
這篇文章主要介紹了詳解使用Docker部署MySQL(數(shù)據(jù)持久化),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
一步到位的Docker全平臺安裝完整指南(Windows/Mac/Linux)
這篇文章主要為大家詳細(xì)介紹了Docker全平臺安裝完整指南,包括Windows/Mac/Linux一步到位,文中的示例代碼講解詳細(xì),有需要的小伙伴可以根據(jù)需求進(jìn)行選擇2025-04-04
Docker Swarm結(jié)合Docker Compose部署集群的實(shí)現(xiàn)
本文主要介紹了Docker Swarm結(jié)合Docker Compose部署集群的實(shí)現(xiàn),通過部署和配置幫助讀者更好地理解并應(yīng)用這些工具,感興趣的可以了解一下2023-12-12
3分鐘用Docker搭建一個Minecraft服務(wù)器
這篇文章主要介紹了3分鐘用Docker搭建一個Minecraft服務(wù)器的相關(guān)資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-11-11

