docker报错“no space left on device docker”

今天mysql插入数据时报了这个错误,我的mysql是docker启动了,想到可能是docker的根目录没有空间了。

查看docker挂载目录

docker info  | grep "Docker Root Dir"

查看一下磁盘使用情况

df -Th

查看docker各类型文件占用情况

docker system df -v
/var/lib/docker/containers/<容器ID> 目录,如果容器使用了默认的日志模式,那么该容器的日志会以 JSON 形式保存在此目录下。
/var/lib/docker/overlay2 目录,该目录包含容器的读写层,如果容器使用自己的文件系统保存了数据,那么这些数据就会写到此目录下。

一般数据不会占用太多磁盘,重点是docker 产生的日志文件,
我这里是gitlab的日志太多了有20多个G。

查看所有容器下日志的大小

find /var/lib/docker/containers/ -name *-json.log |xargs du -sh

将某个日志文件清零

truncate -s 0 /var/lib/docker/containers/3c1452f817fad2296d1c105112faed89d01feaa4ee094e8622c959e072012f7a/3c1452f817fad2296d1c105112faed89d01feaa4ee094e8622c959e072012f7a-json.log

批量处理docker日志

编写一个脚本:
clean_docker_log.sh,内容为:

#!/bin/sh
echo "======== start clean docker containers logs ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
echo "clean logs : $log"
cat /dev/null > $log
done
echo "======== end clean docker containers logs ========"
# chmod +x clean_docker_log.sh
# ./clean_docker_log.sh

执行一下:

sh clean-docker-log.sh

注意清理完日志文件,还要重启对应的docker容器才能生效。

这样还要定期人工去清理日志,所以最好通过配置管理一下。

全局设置docker运行时日志上限

vim /etc/docker/daemon.json
{
  "log-driver":"json-file",
  "log-opts": {"max-size":"500m", "max-file":"3"}
}

max-size=500m,意味着一个容器日志大小上限是500M,
max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json。

设置完重启docker

systemctl daemon-reload
systemctl restart docker

你可能感兴趣的:(docker,k8s,harbor,gitlab,Centos7,Linux运维,docker,容器,运维)