Debian 10机器inode耗尽,Docker容器占用过高如何回收?
Debian 10 Docker Overlay2耗尽inode的解决方法
问题背景
Debian 10机器inode使用率达95%,通过df -i确认问题出在Docker的overlay2挂载目录:
~# df -i Filesystem Inodes IUsed IFree IUse% Mounted on udev 500578 317 500261 1% /dev tmpfs 504337 547 503790 1% /run /dev/sda1 3276800 3090639 186161 95% / tmpfs 504337 1 504336 1% /dev/shm tmpfs 504337 3 504334 1% /run/lock tmpfs 504337 17 504320 1% /sys/fs/cgroup overlay 3276800 3090639 186161 95% /var/lib/docker/overlay2/c238a2f5bcd5e7e193d572fd4b331510cd2438d113a66e9125f983c929cd8485/merged overlay 3276800 3090639 186161 95% /var/lib/docker/overlay2/5f3ee0ad57f147f8dba95e1e06ea98fc697c72ff8eaaafa6494faeb8f0742096/merged tmpfs 504337 11 504326 1% /run/user/10976 tmpfs 504337 11 504326 1% /run/user/10762 shm 504337 1 504336 1% /var/lib/docker/containers/135852b9e95d22ace0cf10b27752a3ad15d1fdfaebcde74f546c26ae4ef01ad8/mounts/shm shm 504337 1 504336 1% /var/lib/docker/containers/cd9619f7703b1e9fee7c1338379dab5270260d23834b27f278c57500b5e50b5a/mounts/shm
当前仅运行2个容器,无悬空镜像:
~# docker info Containers: 2 Running: 2 Paused: 0 Stopped: 0 Images: 19 Server Version: 20.10.18 Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Native Overlay Diff: true userxattr: false Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: io.containerd.runtime.v1.linux runc io.containerd.runc.v2 Default Runtime: runc Init Binary: docker-init containerd version: 9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6 runc version: v1.1.4-0-g5fd4c4d init version: de40ad0 Security Options: apparmor seccomp Profile: default Kernel Version: 5.7.0-0.bpo.2-amd64 Operating System: Debian GNU/Linux 10 (buster) OSType: linux Architecture: x86_64 CPUs: 2 Total Memory: 3.848GiB Name: name ID: SNF2:X4SU:OLKG:ESHV:PX3U:UJGB:MADV:OZ3R:UCZP:KONV:K4ZV:ILL4 Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false WARNING: No swap limit support
执行docker system prune和docker image prune无法解决问题,以下是具体回收inode的方法:
解决步骤
1. 清理容器内部的大量小文件
容器运行过程中可能生成大量临时文件、日志文件,进入容器排查并清理:
# 进入容器 docker exec -it <容器ID/名称> /bin/bash # 统计系统总文件数 find / -type f | wc -l # 按一级目录统计文件数量,定位小文件密集目录 find / -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
找到冗余文件后(比如过期日志、缓存文件)直接删除,清理完成后退出容器。
2. 清理Docker Overlay2残留层
停止容器后,检查并清理对应的overlay2层文件(操作前请备份重要数据):
# 停止目标容器 docker stop <容器ID/名称> # 查看容器对应的overlay2上层目录 docker inspect <容器ID> | grep "UpperDir"
输出路径类似/var/lib/docker/overlay2/xxx/diff,删除整个对应xxx目录:
rm -rf /var/lib/docker/overlay2/xxx
之后重新启动容器,Docker会重建所需的overlay2层。
3. 配置Docker日志轮转并清理旧日志
默认Docker日志无轮转设置,会生成大量小日志文件占用inode:
- 创建或编辑
/etc/docker/daemon.json:
{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }
- 重启Docker服务:
systemctl restart docker
- 手动清理旧的大日志文件:
rm -rf /var/lib/docker/containers/<容器ID>/*.log.old
4. 清理无用的Docker卷
容器卷可能积累大量小文件,排查并清理无用卷:
# 列出所有卷 docker volume ls # 查看卷内文件内容 docker run --rm -v <卷名>:/tmp/volume busybox ls -la /tmp/volume # 删除无用卷 docker volume rm <卷名>
内容的提问来源于stack exchange,提问作者Nagri
相关产品推荐
相关产品推荐

