一、問題
今天突然發(fā)現(xiàn)跑服務(wù)器上的項(xiàng)目掛了,上去看了一下原來是磁盤滿了。
df -h
看來是目錄 /var/lib/docker/overlay2 下占滿了磁盤,看看里面是什么。
二、解決
1、查看 /var/lib/docker 目錄
這一塊只是查找哪些文件占滿了磁盤,不感興趣的朋友可以不看。
/var/lib/docker 目錄是 docker 的默認(rèn)目錄,進(jìn)去看看
cd /var/lib/docker
檢索文件的最大深度1,即只檢索匯總計(jì)算當(dāng)前目錄下的文件
du -h --max-depth=1
(1)、containers 目錄
可以看到 containers 中占磁盤空間最大,這是 docker 存儲鏡像的目錄,進(jìn)去看看里面有什么
看不出什么來,繼續(xù)進(jìn)入
可以看到一個(gè) -json.log 的文件很大,竟然有4G多,這是 docker 的日志文件,看看 containers 目錄的其他子目錄是不是也有這個(gè)類型的文件
看來也有,并且和所在目錄同名,直接查看所有的 -json.log 目錄吧
du -ha /var/lib/docker/containers/ | grep "json.log" | sort -rh
嗯。。。各個(gè)都不小,把他們?nèi)辶艘材芮宄鰜砗芸捎^的空間了。
等會停了容器再清。
(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 占磁盤空間比較大,work 目錄可以不用管。
diff :
diff 文件夾是一個(gè)只讀的文件系統(tǒng)層,它包含了Docker鏡像的變更內(nèi)容。當(dāng)您對容器進(jìn)行修改或添加新文件時(shí),這些變更會被記錄在 diff 文件夾中。每個(gè)Docker鏡像都有一個(gè)對應(yīng)的 diff 文件夾,用于存儲與基礎(chǔ)鏡像的差異。
merged:
merged 文件夾是一個(gè)可讀寫的文件系統(tǒng)層,它是由基礎(chǔ)鏡像和 diff 文件夾合并而成的。當(dāng)您啟動一個(gè)Docker容器時(shí), merged 文件夾中的內(nèi)容將作為容器的文件系統(tǒng)。這個(gè)文件夾是容器運(yùn)行時(shí)的可寫層,您可以在容器中對文件進(jìn)行修改或添加新文件,這些修改將存儲在 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 ========"
這是從這個(gè)老哥的博客中拿到的,很多博客都說這個(gè)腳本可以清除還在運(yùn)行的docker日志,保險(xiǎn)起見,我這里就先把運(yùn)行的容器給停了。
之后執(zhí)行腳本文件,命令如下:
sh docker_logs_clean.sh start
再看一下磁盤空間:
df -h
可以看到清理出一些空間了。
如果保存時(shí)報(bào)如下錯:
“docker_logs_clean.sh” E514: write error (file system full?)
這是因?yàn)榇疟P已滿,先手動清理一些空間出來。我這里就清除了一下 /var/lib/docker/volumes 目錄下的日志文件。
假如執(zhí)行清理腳本報(bào)錯:
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 目錄
假如不更新項(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 目錄的磁盤占比
du -h --max-depth=1
可能是因?yàn)槲仪懊嬉呀?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日志大小
按照前面的方式清理,隔一段時(shí)間后磁盤又會被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ū)動,常見的選項(xiàng)包括 “overlay2”、“aufs”、“btrfs”、“devicemapper” 和 “zfs”,一般為 “overlay2”。
storage-opts:存儲驅(qū)動程序選項(xiàng)。
log-driver:容器日志的默認(rèn)驅(qū)動程序,默認(rèn)為 “json-file” 。
log-opts:容器默認(rèn)日志驅(qū)動程序選項(xiàng)。
然后重新加載一下docker的配置文件
systemctl daemon-reload
再重啟一下docker
systemctl restart docker
注意,重啟之后原來的鏡像和容器要刪除,不然重新啟動是報(bào)錯的?。。?/p>
如果啟動容器時(shí)報(bào)如下錯就是因?yàn)闆]有重新拉取鏡像。
docker: Error response from daemon: open /var/lib/docker/overlay2/2ef38eb701745d5e944dd8c04d404347cd1d7d87140ff48817c935901bcd9550/committed: no such file or directory.
假如重啟docker失敗
報(bào)錯如下:
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"
文章來源:http://www.zghlxwxcb.cn/news/detail-809901.html
然后再使用docker-compose命令啟動容器。文章來源地址http://www.zghlxwxcb.cn/news/detail-809901.html
到了這里,關(guān)于docker部署項(xiàng)目,/var/lib/docker/overlay2目錄滿了如何清理?的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!