概述:
接到告警提醒,服務器容量不足,去查看了一下,發現確實100g左右容量已基本用完;
分析:
1)查看根目錄下哪些文件夾占用容量較大
使用命令“ du -ah --max-depth=1 / ” 查看目標目錄下所有文件夾的容量:
可以看到目錄 /var 下面占用了很大的容量,繼續使用命令查看“du -ah --max-depth=1 /var”:
繼續跟進lib目錄“du -ah --max-depth=1 /var/lib”:
繼續下鉆“du -ah --max-depth=1 /var/lib/docker/”:
2、看到這里發現/var/lib/docker/overlay2 下的容量非常大
在 Linux 系統中,/var/lib/docker/overlay2 是 Docker 容器引擎使用 overlay2 存儲驅動 時的核心數據存儲目錄,主要用于管理 Docker 鏡像和容器的文件系統分層數據。
具體作用:
Docker 采用 分層存儲機制(類似 “棧” 的結構),而 overlay2 是 Docker 推薦的存儲驅動之一(基于 Linux 內核的 overlayfs 技術),/var/lib/docker/overlay2 正是這種機制的實際數據存放位置,主要包含:
1、 鏡像層(Image Layers):
Docker 鏡像由多個只讀層(Layer)組成(例如基礎系統層、依賴庫層、應用層等),這些層的實際文件數據就存儲在該目錄下。多個鏡像可能共享相同的基礎層,從而節省空間。
2、容器讀寫層(Container Layers):
當容器啟動時,Docker 會在鏡像只讀層之上添加一個 可寫層(用于容器運行時的文件修改、新增、刪除等操作),這部分臨時數據也存儲在 overlay2 目錄中。容器停止后,可寫層不會自動刪除(除非手動清理)。
元數據:
3、記錄各層的關聯關系、校驗信息等,確保 Docker 能正確組裝鏡像和容器的文件系統。
為什么這個目錄會很大?
- 長期使用 Docker 后,未清理的 舊鏡像、停止的容器(及其可寫層)、未使用的臨時層 會不斷累積,導致目錄占用空間增大。
- 容器運行過程中產生的日志、臨時文件、緩存等也可能存放在可寫層中,進一步占用空間。
如何清理空間?
如果該目錄占用過大,可以通過 Docker 自帶的命令安全清理(操作前建議確認不需要的資源):
清理所有未使用的資源(停止的容器、未被引用的鏡像、懸空鏡像、未使用的卷等):
本次操作就是用下面的這個命令:
bash
docker system prune -a --volumes
- -a:刪除所有未被容器引用的鏡像(包括未打標簽的 “懸空鏡像”)。
- –volumes:同時清理未被使用的數據卷(謹慎使用,確保卷中無重要數據)。
單獨清理無用鏡像:
bash
docker image prune -a
單獨清理停止的容器:
bash
docker container prune
注意:
不要直接手動刪除 overlay2 目錄下的文件(可能導致 Docker 數據損壞,容器 / 鏡像無法正常使用)。
清理前確保重要容器已停止或備份,避免誤刪正在使用的資源。
通過以上操作,通常能顯著減少 overlay2 目錄的占用空間。
3)執行完以上操作發現容量還是比較大
繼續使用“du -ah --max-depth=1 /var/lib/docker/overlay2/”查看目錄的大小:
發現紅框這個文件非常大,所以就看這個地方:
911d4b0c8e6ef3ad8cad514279b0b0ba28bb6c6a32cac154aba1d4a703c85836 的子目錄占用(43G),其他目錄占用空間較小。下面具體解釋并提供處理思路:
這些哈希命名的目錄是什么?
overlay2 目錄下的子目錄名稱是隨機哈希值,每個目錄對應 Docker 的一個 存儲層(可能是鏡像的只讀層,或容器的可寫層):
- 帶 -init 后綴的目錄(如 16fd4ddd…-init)通常是容器初始化時的臨時層,空間很小。
- 其他無后綴的目錄是常規的鏡像層或容器運行時的可寫層。
你看到的 911d4b0c8e6ef3ad8cad514279b0b0ba28bb6c6a32cac154aba1d4a703c85836 就是一個占用大量空間的層(極可能是某個容器的可寫層,因為鏡像層通常不會單獨這么大,且多個鏡像會共享層)。
如何找到這個大目錄對應的容器 / 鏡像?
要確定這個 43G 的層屬于哪個容器或鏡像,需要通過 Docker 的元數據關聯。步驟如下:
查看所有容器的存儲層信息:
運行以下命令,查找哪個容器的 GraphDriver.Data.MergedDir 或 UpperDir 包含這個哈希目錄:
bash
docker inspect $(docker ps -aq) | grep -B 10 "911d4b0c8e6ef3ad8cad514279b0b0ba28bb6c6a32cac154aba1d4a703c85836"
輸出中會顯示容器的 Name 或 Id,說明這個層是該容器的可寫層(容器運行時產生的文件都存在這里)。
如果不是容器,再檢查鏡像:
若上述命令沒結果,可能是某個鏡像的層(較少見,因為鏡像層通常被共享),可通過鏡像元數據查找:
bash
docker inspect $(docker images -q) | grep -B 10 "911d4b0c8e6ef3ad8cad514279b0b0ba28bb6c6a32cac154aba1d4a703c85836"
執行命令:
docker inspect 結果來看,這個 43G 的大目錄 911d4b0c8e6ef3ad8cad514279b0b0ba28bb6c6a32cac154aba1d4a703c85836 明確屬于某個容器的 可寫層(UpperDir 指向該目錄,這是容器運行時寫入數據的位置)。
第一步:找到這個容器的具體信息(ID / 名稱)
你的 docker inspect 輸出只顯示了部分細節,需要進一步定位對應的容器。可以用以下命令直接找到該容器的 ID 和名稱:
bash
# 遍歷所有容器,找到包含該哈希的容器,并輸出其ID和名稱
for container in $(docker ps -aq); doif docker inspect $container | grep -q "911d4b0c8e6ef3ad8cad514279b0b0ba28bb6c6a32cac154aba1d4a703c85836"; thenecho "容器ID: $container"docker inspect --format '{{.Name}}' $container # 輸出容器名稱fi
done
運行后會得到類似結果(示例):
plaintext
容器ID: abc123456
/nginx-app # 容器名稱
第二步:分析容器內的大文件來源
確定容器后,需要進入容器內部,查看哪些文件占用了大量空間:
- 先檢查容器狀態(是否在運行):
bash
docker ps | grep 容器ID/名稱 # 若有輸出,說明正在運行;否則是已停止
- 進入容器內部查找大文件:
bash
# 若容器運行中,直接進入
docker exec -it 容器ID/名稱 /bin/bash
# 查看目錄下最大的20個文件
du -a / 2>/dev/null | sort -nr | head -n 20
絕對不要手動刪除 overlay2 目錄下的文件,否則可能導致 Docker 數據損壞。
可以發現/tmp 容量河大有22g; 進入該目錄看有什么文件:
查看該目錄下最大的20個文件:
刪除文件
rm -f /tmp/+~JF*.tmp
# 示例:刪除7天前的日志(假設日志按日期命名,如 sys-console.2025-08-05.log)
find /juzi/server/logs -name "*.log" -mtime +7 -delete
注意事項
清理文件時,確保不刪除應用運行必需的臨時文件(如正在使用的緩存),必要時先暫停應用再清理。
操作后建議重啟容器,確保空間釋放生效(docker restart 容器ID)。
通過以上步驟,可顯著減少容器占用的空間,并避免未來再次出現類似問題。
從文件路徑(/tmp 臨時目錄)和命名格式(+~JF 開頭的 .tmp 文件)來看,這些文件大概率是辦公軟件(如 LibreOffice、OpenOffice 等)在編輯文檔時生成的臨時備份文件。
具體說明:
- 臨時備份文件的作用
LibreOffice、OpenOffice 等辦公軟件在編輯文檔(如 Word 文檔、Excel 表格等)時,會自動創建臨時文件,用于:
實時保存用戶的編輯內容,防止程序崩潰、意外關閉時丟失數據;
作為文檔的臨時緩存,提升編輯時的響應速度。
這類文件的命名通常包含隨機字符(如這里的 JF 后接一串數字),并以 .tmp 為后綴,存放于系統臨時目錄(/tmp)。
- 為何會殘留?
正常情況下,當你關閉辦公軟件或保存文檔后,這些臨時文件會被自動刪除。但如果程序異常退出(如強制關閉、崩潰),臨時文件可能來不及清理,就會殘留在 /tmp 目錄中。
關于 ip2region.xdb
這個文件是一個IP 地址定位數據庫(ip2region 是一個常用的開源 IP 庫),用于將 IP 地址解析為具體的地理位置(如國家、城市等)。很多應用程序(如日志分析工具、后臺服務)可能會臨時使用這個庫文件,用完后可能留在 /tmp 目錄。
- 處理建議:
如果確認近期沒有正在編輯的辦公文檔,這些 +~JF*.tmp 文件可以安全刪除(避免占用磁盤空間);
ip2region.xdb 若暫時不用,也可刪除,后續有程序需要時會重新生成或下載。
刪除命令(謹慎操作,確保不再需要):
bash
rm -f /tmp/+~JF*.tmp /tmp/ip2region.xdb