docker部署項目/var/lib/docker/overlay2目錄滿了該如何清理
一、問題
今天突然發(fā)現(xiàn)跑服務(wù)器上的項目掛了,上去看了一下原來是磁盤滿了。
df -h
看來是目錄 /var/lib/docker/overlay2 下占滿了磁盤,看看里面是什么。
二、解決
1、查看 /var/lib/docker 目錄
這一塊只是查找哪些文件占滿了磁盤,不感興趣的朋友可以不看。
/var/lib/docker 目錄是 docker 的默認目錄,進去看看
cd /var/lib/docker
檢索文件的最大深度1,即只檢索匯總計算當前目錄下的文件
du -h --max-depth=1
(1)、containers 目錄
可以看到 containers 中占磁盤空間最大,這是 docker 存儲鏡像的目錄,進去看看里面有什么
看不出什么來,繼續(xù)進入
可以看到一個 -json.log 的文件很大,竟然有4G多,這是 docker 的日志文件,看看 containers 目錄的其他子目錄是不是也有這個類型的文件
看來也有,并且和所在目錄同名,直接查看所有的 -json.log 目錄吧
du -ha /var/lib/docker/containers/ | grep "json.log" | sort -rh
嗯。。。各個都不小,把他們?nèi)辶艘材芮宄鰜砗芸捎^的空間了。
等會停了容器再清。
(2)、volumes 目錄
這里接著看看 volumes 目錄
看到也是類似 containers 目錄的東西,先進第一個看看
可以看到是一個 _data 目錄,看不出什么,繼續(xù)進入
其中 flow.jar 是我的jar包,目錄 logs 應(yīng)該就是日志文件了,進去看看
還放在我的包名命名的目錄里,繼續(xù)進入
也是很多的日志文件。。?;氐?logs 目錄統(tǒng)計一下吧
du -h --max-depth=1
可以看到有5G多。。。
同樣的方式進入 volums 目錄中的第二個子目錄
可以看到也有2G多。。。
也可以直接查看目錄的詳細信息,命令如下:
du -ha /var/lib/docker/volumes/ | grep "info.*.log" | sort -rh
可以看到有很多的日志文件,單個雖然不大,但卻很多。
這里也先不清,后面再清。
(3)、overlay2 目錄
再看看 overlay2 目錄
雖然只有11G,但進去發(fā)現(xiàn)目錄挺多,先看看各個目錄的大小
du -h --max-depth=1
找出最大的應(yīng)該目錄,看看里面有什么
看看哪個文件夾比較大
du -h --max-depth=1
可以看到 merged 和 diff 占磁盤空間比較大,work 目錄可以不用管。
diff :
diff 文件夾是一個只讀的文件系統(tǒng)層,它包含了Docker鏡像的變更內(nèi)容。當您對容器進行修改或添加新文件時,這些變更會被記錄在 diff 文件夾中。每個Docker鏡像都有一個對應(yīng)的 diff 文件夾,用于存儲與基礎(chǔ)鏡像的差異。
merged:
merged 文件夾是一個可讀寫的文件系統(tǒng)層,它是由基礎(chǔ)鏡像和 diff 文件夾合并而成的。當您啟動一個Docker容器時, merged 文件夾中的內(nèi)容將作為容器的文件系統(tǒng)。這個文件夾是容器運行時的可寫層,您可以在容器中對文件進行修改或添加新文件,這些修改將存儲在 merged 文件夾中。
2、清理
前面已經(jīng)知道了日志在
/var/lib/docker/containers
/var/lib/docker/volumes
/var/lib/docker/overlay2
(1)、清理 /var/lib/docker/containers 目錄
先創(chuàng)建清理腳本文件,這里名為 docker_logs_clean.sh ,可以自定義,命令如下:
touch docker_logs_clean.sh
查看文件可以發(fā)現(xiàn) docker_logs_clean.sh 是只讀的
賦予讀寫權(quán)限,命令如下:
chmod +777 docker_logs_clean.sh
然后在加入如下腳本:
echo "======== start clean docker containers logs ========" logs=$(find /var/lib/docker/containers/ -name *-json.log) for log in $logs do echo "clean containers logs : $log" cat /dev/null > $log done echo "======== end clean docker containers logs ========"
這是從這個老哥的博客中拿到的,很多博客都說這個腳本可以清除還在運行的docker日志,保險起見,我這里就先把運行的容器給停了。
之后執(zhí)行腳本文件,命令如下:
sh docker_logs_clean.sh start
再看一下磁盤空間:
df -h
可以看到清理出一些空間了。
如果保存時報如下錯:
“docker_logs_clean.sh” E514: write error (file system full?)
這是因為磁盤已滿,先手動清理一些空間出來。我這里就清除了一下 /var/lib/docker/volumes 目錄下的日志文件。
假如執(zhí)行清理腳本報錯:
line 4: syntax error near unexpected token `$‘do\r’
可以用如下命令查看腳本文件換行符是否合法:
cat -v docker_logs_clean.sh
cat -v 文件名:查看換行符是否合法,如果是上述的,則行結(jié)尾會是^m
需要轉(zhuǎn)換成linux/unix格式的”\n”
原因:這可能是在window系統(tǒng)中創(chuàng)建好文件,再上傳到服務(wù)器,導(dǎo)致?lián)Q行符不符合Linux的格式。
解決辦法:
sed 's/\r//' docker_logs_clean.sh > docker_logs_clean.sh
(2)、清理 /var/lib/docker/volumes 目錄
假如不更新項目,只是想清一下日志,前面已經(jīng)查到 /var/lib/docker/volumes 目錄下的日志,這里重新查一下,命令如下:
find /var/lib/docker/volumes -name "*.log"
使用如下命令清除
find /var/lib/docker/volumes -type f -name "*.log" -delete
可以看到那些日志文件都清除了。
再檢查一下文件docker占比
du -h --max-depth=1
可以看到 /var/lib/docker/volumes 目錄只剩下791M了,這些是我的jar包。
假如要更新項目,則清除所有的鏡像,命令如下:
docker system prune -a
輸入 y 回車就可以刪除了,我使用的是docker-compose部署的微服務(wù),這里就先不刪除。
刪除所有的卷,命令如下:
docker volume prune
輸入 y 回車就可以刪除了,我使用的是docker-compose部署的微服務(wù),這里就先不刪除。
使用docker-compose時只清除項目鏡像和容器,需要 docker-compose.yml 文件所在目錄,我這里是 /www/wwwroot/changjing/jar ,命令如下
docker-compose down --rmi all
看一下docker-compose的容器
docker-compose ps
以及鏡像
docker-compose images
可以看到容器和鏡像都被刪除了。
再查看一下 /var/lib/docker 目錄的磁盤占比
du -h --max-depth=1
可能是因為我前面已經(jīng)清理過日志文件了,看不出什么變化, /var/lib/docker/volumes 目錄占791M是jar包。
那再刪除一下卷:
docker volume prune
可以看到 /var/lib/docker/volumes 目錄釋放了一些空間,應(yīng)該是把jar包清理了。
再查看一下服務(wù)器磁盤空間分布
df -h
應(yīng)該清得差不多了。
(3)、清理 /var/lib/docker/overlay2 目錄
經(jīng)過前面的清理只剩下 /var/lib/docker/overlay2 目錄占磁盤空間大一些了,使用刪除鏡像和容器的命令清理:
docker system prune -a
清除了2G的空間,再看一下docker磁盤占用
du -h --max-depth=1
可以看到 /var/lib/docker/overlay2 目錄也清理得差不多了。
(4)、限制docker日志大小
按照前面的方式清理,隔一段時間后磁盤又會被docker日志占滿,這里設(shè)置一下日志上限。
編輯 /etc/docker/daemon.json 文件,第一次應(yīng)該是沒有的,創(chuàng)建就好了,加入如下配置:
{ "registry-mirrors": ["http://hub-mirror.c.163.com"], "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true", "overlay2.size=15G" ], "log-driver": "json-file", "log-opts": { "max-size": "1024m", "max-file": "3" } }
解釋:
registry-mirrors:設(shè)置鏡像加速。
storage-driver:指定Docker的存儲驅(qū)動,常見的選項包括 “overlay2”、“aufs”、“btrfs”、“devicemapper” 和 “zfs”,一般為 “overlay2”。
storage-opts:存儲驅(qū)動程序選項。
log-driver:容器日志的默認驅(qū)動程序,默認為 “json-file” 。
log-opts:容器默認日志驅(qū)動程序選項。
然后重新加載一下docker的配置文件
systemctl daemon-reload
再重啟一下docker
systemctl restart docker
注意,重啟之后原來的鏡像和容器要刪除,不然重新啟動是報錯的?。?!
如果啟動容器時報如下錯就是因為沒有重新拉取鏡像。
docker: Error response from daemon: open /var/lib/docker/overlay2/2ef38eb701745d5e944dd8c04d404347cd1d7d87140ff48817c935901bcd9550/committed: no such file or directory.
假如重啟docker失敗
報錯如下:
docker.socket: Failed with result ‘service-start-limit-hit’.
只要把 daemon.json 的改為 daemon.conf ,命令如下:
mv /etc/docker/daemon.json /etc/docker/daemon.conf
再次重啟就好了。
(5)、限制docker-compose的單個容器日志
這個只有使用docker-compose部署項目的小伙伴才能用到,在每個容器配置下加入如下配置:
logging: driver: "json-file" options: max-size: "256m" max-file: "3"
然后再使用docker-compose命令啟動容器。
總結(jié)
到此這篇關(guān)于docker部署項目/var/lib/docker/overlay2目錄滿了該如何清理的文章就介紹到這了,更多相關(guān)/var/lib/docker/overlay2目錄滿了內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker-compose:數(shù)據(jù)卷volumes掛載規(guī)則說明
這篇文章主要介紹了docker-compose:數(shù)據(jù)卷volumes掛載規(guī)則說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03docker 容器自定義 hosts 網(wǎng)絡(luò)訪問操作
這篇文章主要介紹了docker 容器自定義 hosts 網(wǎng)絡(luò)訪問操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03cordon節(jié)點drain驅(qū)逐節(jié)點delete節(jié)點詳解
這篇文章主要為大家介紹了cordon節(jié)點drain驅(qū)逐節(jié)點delete節(jié)點詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11Docker安裝配置ES(elasticsearch)步驟詳解
這篇文章主要給大家介紹了關(guān)于Docker安裝配置ES(elasticsearch)的相關(guān)資料,本文主要介紹了如何在指定目錄下安裝ES和Kibana,以及如何用IK分詞器進行分詞,需要的朋友可以參考下2024-10-10Jenkins+Docker持續(xù)集成的實現(xiàn)
Jenkins是基于Java開發(fā)的一種持續(xù)集成工具,用于監(jiān)控持續(xù)重復(fù)的工作,旨在提供一個開放易用的軟件平臺,使軟件的持續(xù)集成變成可能。本文介紹了Jenkins Docker持續(xù)集成,分享給大家2021-05-05