Docker overlay2占用磁盘空间过多

3
我有关于Docker overlay2文件夹的问题。
当我输入du -sj /var/lib/docker/overlay2时,它会显示:
85G overlay2/

它持续增长。 我尝试使用命令来修剪系统,例如:

docker system prune -a

但输出为:
Total reclaimed space: 0B

我也尝试在我的Docker Compose中添加max-filemax-size。添加这些行后,我重新创建了容器。但问题仍然存在,有没有办法解决它,只是停止占用磁盘空间呢?
编辑:
Docker信息:

服务器:
容器:10
运行中:10
已暂停:0
已停止:0
镜像:6
服务器版本:19.03.8
存储驱动程序:overlay2
支持文件系统:
支持 d_type:true
原生叠加差异:true
日志记录驱动程序:json-file
Cgroup 驱动程序:cgroupfs
插件:
卷:本地
网络:桥接 主机 ipvlan macvlan null 叠加
日志:awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm:未激活
运行时:runc
默认运行时:runc
Init 二进制文件:docker-init
containerd 版本:7ad184331fa3e55e52b890ea95e65ba581ae3429
runc 版本:dc9208a3303feef5b3839f4323d9beb36df0a9dd
init 版本:fec3683
安全选项:
apparmor
seccomp
配置文件:默认
内核版本:4.15.0-91-generic
操作系统:Ubuntu 18.04.4 LTS
操作系统类型:linux
架构:x86_64
CPU 数量:32
总内存:62.86GiB
名称:machine
ID:TRX2:AJZG:LNJF:UCPW:MQQB:2PLR:R7KM:VHEV:KBOG:IBT4:JX4R:WR6V
Docker 根目录:/var/lib/docker
调试模式:false
注册表:https://index.docker.io/v1/\
标签:
实验性的:false
不安全的注册表:
127.0.0.0/8
启用实时恢复:false

Docker镜像:(出于安全原因,我不会显示名称)

TAG IMAGE ID CREATED SIZE
latest 667ac029b200 2 years ago 7.6GB
latest cb9df5aac4ac 2 years ago 12.9GB
latest d445c0adc9a5 3 weeks ago 220MB
latest 227d9f0554d3 2 years ago 1.34GB
latest b80092729008 2 years ago 758MB
latest f32a97de94e1 2 years ago 25.8MB

你正在运行哪些容器?它们占用了多少空间(答案可能略高于85G)?请在你的问题中包含 docker infodocker image ls -adocker container ls -a 的输出。 - BMitch
3个回答

3
#!/bin/bash
# Remove exited containers
/usr/bin/docker ps -a -q -f status=exited | xargs --no-run-if-empty docker rm -v

# Remove dangling images
/usr/bin/docker images -f "dangling=true" -q | xargs --no-run-if-empty docker rmi

# Remove unused images
/usr/bin/docker images | awk '/ago/  { print $3}' | xargs --no-run-if-empty docker rmi

# Remove dangling volumes
/usr/bin/docker volume ls -qf dangling=true | xargs --no-run-if-empty docker volume rm

使用cron来运行。在我的情况下,每小时运行一次。

在此输入图片描述


这并没有帮助,我尝试过了,但它什么也没清除。 - Nikola Roganovic

1

您有10个容器正在运行,而2年前的镜像强烈表明您很可能在这些容器内部更改了文件系统(编写日志、临时文件,甚至安装应用程序)。修剪操作不会删除这些容器、它们的镜像、这些容器内的文件系统更改或这些容器的日志。您将在overlay2中看到这些文件系统更改,因此请使用以下方式查看每个容器创建/更改的文件:

docker container diff ${container_name_or_id}

e.g.:

$ docker container diff d7c
C /run
A /run/user
A /run/user/1000
C /tmp
A /tmp/.X11-unix
C /home
A /home/user

您的列表可能会更长,您可以进入容器删除不再需要的任何文件(使用docker exec假设容器具有shell和其他CLI工具)。

有关清理大型overlay2目录的更多信息,请参见is it safe to clean docker/overlay2


为了避免overlay2占用整个磁盘(假设频繁重新部署),应确保永远不会编辑/添加图像的一部分的文件,这样docker container diff <container_id>就应该始终是一个空列表? - nitzel
当图像被重建(例如为新版本)并重新部署时,容器将被重新创建,旧容器以及所有文件系统更改都可以安全地清除。在容器生态系统中,旧图像和长时间运行的容器是代码异味。一些应用程序总是写入文件系统,因此通常无法完全清空差异,但它应该是短暂的。 - BMitch

0
  1. 使用 docker volume ls 命令,可以查看卷和大小
  2. 清除不需要的内容
  3. 如果您正在使用基于 Linux 的镜像,可以使用 apt-get autoremove 命令来删除孤立的软件包

我也尝试过这个,但是我没有未使用的卷。 - Nikola Roganovic
好的,那么唯一剩下的就是从所有容器中删除不必要的软件包。 - Shaktirajsinh Jadeja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接