Docker占用磁盘清理

开发环境遇到一台服务器磁盘空间耗尽的问题,经排查发现是Docker虚拟卷的的overlay目录不断膨胀,占用磁盘过多。这里记录一下排查及修复思路

# 背景

开发环境遇到一台服务器磁盘空间耗尽的问题,经排查发现是Docker虚拟卷的的overlay目录不断膨胀,占用磁盘过多。这里记录一下排查及修复思路

# 参考文档

# 分析docker磁盘占用

# 1.使用docker命令查看资源占用

1
docker system df

列出了docker 使用磁盘的 4 种类型: Images:所有镜像占用的空间,包括拉取下来的镜像,和本地构建的。 Containers:运行的容器占用的空间,表示每个容器的读写层的空间。 Local Volumes:容器挂载本地数据卷的空间。 Build Cache:镜像构建过程中产生的缓存空间(只有在使用 BuildKit 时才有,Docker 18.09 以后可用)。

# 2. docker容器占用的磁盘空间

每次创建一个容器时,都会有一些文件和目录被创建,例如:/var/lib/docker/containers/ID目录,如果容器使用了默认的日志模式,他的所有日志都会以JSON形式保存到此目录下。/var/lib/docker/overlay2目录下含有容器的读写层,如果容器使用自己的文件系统保存了数据,那么就会写到此目录下。

当一些容器中代码出错,不断写入数据或日志时,就会造成/var/lib/docker/overlay2目录不断膨胀,占用大量磁盘。

因此,通过linux命令,去分析/var/lib/docker/overlay2目录中占用大空间的路径,再去找到对应的容器,也是一种思路

# 清理docker占用

# 1. 清理docker日志文件

1
2
3
4
5
6
7
8
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 ========"

# 2. 清理docker系统的文件

包括无用镜像,无用卷,构建缓存等,执行命令清理

1
2
3
docker system prune -a 
 
docker volume prune

# 3. 解决overlay2文件夹占用磁盘过大

修改docker的/etc/docker/daemon.json配置文件,加入

1
2
3
4
    "log-opts": {
        "max-size": "100m",
        "max-file": "5"
    }

这个配置表示:docker系统层为一个容器创建的单个日志最大为100m,最多存储5个。

然后重启docker

1
2
systemctl stop docker
systemctl start docker

这样之后创建的新容器都会遵从这个日志的配置

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计