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