docker容器臨時(shí)文件去除,服務(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 存儲(chǔ)驅(qū)動(dòng) 時(shí)的核心數(shù)據(jù)存儲(chǔ)目錄,主要用于管理 Docker 鏡像和容器的文件系統(tǒng)分層數(shù)據(jù)。
具體作用:
Docker 采用 分層存儲(chǔ)機(jī)制(類似 “棧” 的結(jié)構(gòu)),而 overlay2 是 Docker 推薦的存儲(chǔ)驅(qū)動(dòng)之一(基于 Linux 內(nèi)核的 overlayfs 技術(shù)),/var/lib/docker/overlay2 正是這種機(jī)制的實(shí)際數(shù)據(jù)存放位置,主要包含:
1、 鏡像層(Image Layers):
- Docker 鏡像由多個(gè)只讀層(Layer)組成(例如基礎(chǔ)系統(tǒng)層、依賴庫層、應(yīng)用層等),這些層的實(shí)際文件數(shù)據(jù)就存儲(chǔ)在該目錄下。
- 多個(gè)鏡像可能共享相同的基礎(chǔ)層,從而節(jié)省空間。
2、容器讀寫層(Container Layers):
當(dāng)容器啟動(dòng)時(shí),Docker 會(huì)在鏡像只讀層之上添加一個(gè) 可寫層(用于容器運(yùn)行時(shí)的文件修改、新增、刪除等操作),這部分臨時(shí)數(shù)據(jù)也存儲(chǔ)在 overlay2 目錄中。
容器停止后,可寫層不會(huì)自動(dòng)刪除(除非手動(dòng)清理)。
元數(shù)據(jù):
3、記錄各層的關(guān)聯(lián)關(guān)系、校驗(yàn)信息等,確保 Docker 能正確組裝鏡像和容器的文件系統(tǒng)。
為什么這個(gè)目錄會(huì)很大?
- 長期使用 Docker 后,未清理的 舊鏡像、停止的容器(及其可寫層)、未使用的臨時(shí)層 會(huì)不斷累積,導(dǎo)致目錄占用空間增大。
- 容器運(yùn)行過程中產(chǎn)生的日志、臨時(shí)文件、緩存等也可能存放在可寫層中,進(jìn)一步占用空間。
如何清理空間?
如果該目錄占用過大,可以通過 Docker 自帶的命令安全清理(操作前建議確認(rèn)不需要的資源):
清理所有未使用的資源(停止的容器、未被引用的鏡像、懸空鏡像、未使用的卷等):
本次操作就是用下面的這個(gè)命令:
bash docker system prune -a --volumes
- -a:刪除所有未被容器引用的鏡像(包括未打標(biāo)簽的 “懸空鏡像”)。
- –volumes:同時(shí)清理未被使用的數(shù)據(jù)卷(謹(jǐn)慎使用,確保卷中無重要數(shù)據(jù))。
單獨(dú)清理無用鏡像:
bash docker image prune -a
單獨(dú)清理停止的容器:
bash docker container prune
注意:
不要直接手動(dòng)刪除 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)紅框這個(gè)文件非常大,所以就看這個(gè)地方:
911d4b0c8e6ef3ad8cad514279b0b0ba28bb6c6a32cac154aba1d4a703c85836 的子目錄占用(43G),其他目錄占用空間較小。下面具體解釋并提供處理思路:
這些哈希命名的目錄是什么?
overlay2 目錄下的子目錄名稱是隨機(jī)哈希值,每個(gè)目錄對(duì)應(yīng) Docker 的一個(gè) 存儲(chǔ)層(可能是鏡像的只讀層,或容器的可寫層):
- 帶 -init 后綴的目錄(如 16fd4ddd…-init)通常是容器初始化時(shí)的臨時(shí)層,空間很小。
- 其他無后綴的目錄是常規(guī)的鏡像層或容器運(yùn)行時(shí)的可寫層。
你看到的 911d4b0c8e6ef3ad8cad514279b0b0ba28bb6c6a32cac154aba1d4a703c85836 就是一個(gè)占用大量空間的層(極可能是某個(gè)容器的可寫層,因?yàn)殓R像層通常不會(huì)單獨(dú)這么大,且多個(gè)鏡像會(huì)共享層)。
如何找到這個(gè)大目錄對(duì)應(yīng)的容器 / 鏡像?
要確定這個(gè) 43G 的層屬于哪個(gè)容器或鏡像,需要通過 Docker 的元數(shù)據(jù)關(guān)聯(lián)。步驟如下:
查看所有容器的存儲(chǔ)層信息:
運(yùn)行以下命令,查找哪個(gè)容器的 GraphDriver.Data.MergedDir 或 UpperDir 包含這個(gè)哈希目錄:
bash docker inspect $(docker ps -aq) | grep -B 10 "911d4b0c8e6ef3ad8cad514279b0b0ba28bb6c6a32cac154aba1d4a703c85836"
輸出中會(huì)顯示容器的 Name 或 Id,說明這個(gè)層是該容器的可寫層(容器運(yùn)行時(shí)產(chǎn)生的文件都存在這里)。
如果不是容器,再檢查鏡像:
若上述命令沒結(jié)果,可能是某個(gè)鏡像的層(較少見,因?yàn)殓R像層通常被共享),可通過鏡像元數(shù)據(jù)查找:
bash docker inspect $(docker images -q) | grep -B 10 "911d4b0c8e6ef3ad8cad514279b0b0ba28bb6c6a32cac154aba1d4a703c85836"
執(zhí)行命令:

docker inspect 結(jié)果來看,這個(gè) 43G 的大目錄 911d4b0c8e6ef3ad8cad514279b0b0ba28bb6c6a32cac154aba1d4a703c85836 明確屬于某個(gè)容器的 可寫層(UpperDir 指向該目錄,這是容器運(yùn)行時(shí)寫入數(shù)據(jù)的位置)。
第一步:找到這個(gè)容器的具體信息(ID / 名稱)
你的 docker inspect 輸出只顯示了部分細(xì)節(jié),需要進(jìn)一步定位對(duì)應(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)行后會(huì)得到類似結(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個(gè)文件 du -a / 2>/dev/null | sort -nr | head -n 20
絕對(duì)不要手動(dòng)刪除 overlay2 目錄下的文件,否則可能導(dǎo)致 Docker 數(shù)據(jù)損壞。

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

查看該目錄下最大的20個(gè)文件:

刪除文件
rm -f /tmp/+~JF*.tmp
# 示例:刪除7天前的日志(假設(shè)日志按日期命名,如 sys-console.2025-08-05.log) find /juzi/server/logs -name "*.log" -mtime +7 -delete
注意事項(xiàng)
清理文件時(shí),確保不刪除應(yīng)用運(yùn)行必需的臨時(shí)文件(如正在使用的緩存),必要時(shí)先暫停應(yīng)用再清理。
操作后建議重啟容器,確保空間釋放生效(docker restart 容器ID)。
通過以上步驟,可顯著減少容器占用的空間,并避免未來再次出現(xiàn)類似問題。
從文件路徑(/tmp 臨時(shí)目錄)和命名格式(+~JF 開頭的 .tmp 文件)來看,這些文件大概率是辦公軟件(如 LibreOffice、OpenOffice 等)在編輯文檔時(shí)生成的臨時(shí)備份文件。
具體說明:
- 臨時(shí)備份文件的作用
LibreOffice、OpenOffice 等辦公軟件在編輯文檔(如 Word 文檔、Excel 表格等)時(shí),會(huì)自動(dòng)創(chuàng)建臨時(shí)文件,用于:
實(shí)時(shí)保存用戶的編輯內(nèi)容,防止程序崩潰、意外關(guān)閉時(shí)丟失數(shù)據(jù);
作為文檔的臨時(shí)緩存,提升編輯時(shí)的響應(yīng)速度。
這類文件的命名通常包含隨機(jī)字符(如這里的 JF 后接一串?dāng)?shù)字),并以 .tmp 為后綴,存放于系統(tǒng)臨時(shí)目錄(/tmp)。
- 為何會(huì)殘留?
正常情況下,當(dāng)你關(guān)閉辦公軟件或保存文檔后,這些臨時(shí)文件會(huì)被自動(dòng)刪除。但如果程序異常退出(如強(qiáng)制關(guān)閉、崩潰),臨時(shí)文件可能來不及清理,就會(huì)殘留在 /tmp 目錄中。
關(guān)于 ip2region.xdb
這個(gè)文件是一個(gè)IP 地址定位數(shù)據(jù)庫(ip2region 是一個(gè)常用的開源 IP 庫),用于將 IP 地址解析為具體的地理位置(如國家、城市等)。
很多應(yīng)用程序(如日志分析工具、后臺(tái)服務(wù))可能會(huì)臨時(shí)使用這個(gè)庫文件,用完后可能留在 /tmp 目錄。
- 處理建議:
如果確認(rèn)近期沒有正在編輯的辦公文檔,這些 +~JF*.tmp 文件可以安全刪除(避免占用磁盤空間);
ip2region.xdb 若暫時(shí)不用,也可刪除,后續(xù)有程序需要時(shí)會(huì)重新生成或下載。
刪除命令(謹(jǐn)慎操作,確保不再需要):
bash rm -f /tmp/+~JF*.tmp /tmp/ip2region.xdb
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker部署Minio集群的實(shí)現(xiàn)步驟
本文介紹 Docker Compose 部署 Minio 集群的方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-05-05
DockerCE之執(zhí)行docker info出現(xiàn)兩條警告信息及解決方案
這篇文章主要介紹了DockerCE之執(zhí)行docker info出現(xiàn)兩條警告信息及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
docker容器動(dòng)態(tài)添加端口號(hào)的方法
這篇文章主要介紹了docker容器動(dòng)態(tài)添加端口號(hào)的方法,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
Docker容器內(nèi)部無法訪問外網(wǎng)原因以及解決辦法
最近在工作時(shí)遇到一個(gè)問題,這里給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于Docker容器內(nèi)部無法訪問外網(wǎng)原因以及解決辦法,文中給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
Docker 啟動(dòng)Redis 并設(shè)置密碼的操作
這篇文章主要介紹了Docker 啟動(dòng)Redis 并設(shè)置密碼的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11

