0%

Docker占用磁盘过大:处理/var/lib/docker/containers和/var/lib/docker/overlay2文件夹

  1. 前言
  2. /var/lib/docker/containers
    1. 查看文件
    2. 控制容器日志大小
  3. /var/lib/docker/overlay2

前言

有一天服务器磁盘突然满40G了,检查后发现/var/lib/docker文件夹占了36个G,其中containers和overlay2文件夹一个占了22G,一个占了16G。本文记录处理这两个文件夹的方法。

/var/lib/docker/containers

Docker目录/var/lib/docker/containers文件太大 - OrcHome

仔细检查后发现,gitlab容器所属的文件夹中有一个*-json.log文件竟然高达21G!

查阅资料后得知,Docker容器的日志文件默认会一直追加,没有上限

查看文件

列出各个文件夹大小:

1
du -d1 -h /var/lib/docker/containers | sort -h

清理日志文件:

1
sh -c "cat /dev/null > [文件路径]"

查看全部日志:

1
find /var/lib/docker/containers -name *.log

通过容器名称查看日志文件位置

1
docker inspect --format='{{.LogPath}}' [容器ID]

几个命令配合一下,一键清空容器的日志文件:

1
sh -c "cat /dev/null > $(docker inspect --format='{{.LogPath}}' [容器ID])"

控制容器日志大小

局部控制:针对单个容器使用log-opt

  • max-size: 单个日志文件的大小,到达这个值后会进行日志滚动
  • max-file: 日志文件保留的数量
1
docker run -it --log-opt max-size=10m --log-opt max-file=3 nginx

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
version: '3'
services:
nginx:
image: nginx
...
logging:
driver: json-file
options:
max-size: 10m # 单个日志文件的大小,到达这个值后会进行日志滚动
max-file: 3 # 日志文件保留的数量

全局控制:创建或修改全局配置文件/etc/docker/daemon.json,添加如下配置:

1
2
3
4
5
6
7
{
"log-driver":"json-file",
"log-opts":{
"max-size" :"10m",
"max-file":"1"
}
}

重启docker服务

1
2
systemctl daemon-reload
systemctl restart docker

已创建的容器不会受到影响,配置只对新创建的容器生效。

/var/lib/docker/overlay2

该文件夹是docker镜像层的存储位置,每个镜像由多个层构成,若某个层已经在该目录中可以读到,则无需从互联网下载,构建镜像时可以直接读取使用。

一般来说该目录过大的原因在于错误地将日志文件或其他数据写入到容器自身的存储空间中,而不是采用挂载外部目录的方式。

只要保证在容器中进行磁盘写入操作时,写入的位置为挂载目录,该文件夹就不会太大。

其实把overlay2文件夹删了也没啥大事(毕竟真这么干过,空间确实减少了),重启docker服务之后系统又自动建了一个空文件夹

1
2
systemctl daemon-reload
systemctl restart docker

但是在执行docker-compose重新构建容器时,会提示Error response from daemon: … :no such file or directory,找不到overlay2里面的目录了。

解决办法也很简单,执行命令docker system prune -af清理docker中无用的系统资源,docker-compose就能正常执行了。

然后构建容器时会重新下载镜像进行安装,安装完之后overlay2又是十几个G了,没办法。