生产环境Docker占满磁盘致机器故障,咨询清理及优化方案
Docker磁盘空间占满问题:文件删除与预防方案
嘿,我碰到过好几次这种Docker磁盘爆仓搞崩机器的情况,太闹心了!结合你提到的df -h结果(大概率是/var/lib/docker目录占满了),给你梳理下哪些文件能安全删,以及怎么从根源上避免这个问题:
一、哪些文件可以安全删除?
别直接手动去/var/lib/docker里乱删文件,很容易搞坏Docker的存储结构!优先用Docker官方提供的清理命令:
- 停止的容器:用
docker container prune,会自动删除所有处于停止状态的容器,完全安全,不会影响运行中的容器。 - 未被使用的镜像:
- 只删悬空镜像(没有标签、没被任何容器使用的镜像):
docker image prune - 删所有没被容器关联的镜像(包括有标签但没在用的):
docker image prune -a,注意:如果有备用镜像要保留,别加-a参数。
- 只删悬空镜像(没有标签、没被任何容器使用的镜像):
- 无主卷:用
docker volume prune,删除所有没有被任何容器绑定的卷,提醒:先确认这些卷里没有重要数据再执行! - 构建缓存:
docker builder prune,删除镜像构建过程中产生的缓存文件,不影响现有镜像和容器,清理后下次构建可能慢一点,但能释放不少空间。 - Docker日志文件:默认的json-file日志驱动会无限增长,你可以用
truncate -s 0 /var/lib/docker/containers/*/*-json.log清空所有容器的旧日志,这个操作不会影响容器运行,但更建议后续配置日志限制(后面会说)。
二、如何避免Docker生成过多占用空间的文件?
从根源上减少冗余文件生成,比事后清理更省心:
- 配置日志大小限制:
编辑Docker的配置文件/etc/docker/daemon.json(没有就新建),添加日志限制参数:
上面的配置是限制每个容器的单个日志文件最大10MB,最多保留3个备份文件,之后重启Docker服务生效:{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }systemctl restart docker - 定期自动清理:
设置crontab定时任务,比如每周日凌晨2点自动清理冗余资源:0 2 * * 0 docker system prune -af --volumes-a删未用镜像,-f自动确认,--volumes连无主卷一起删,注意:如果你的环境有需要保留的未用镜像/卷,调整参数。 - 使用轻量级基础镜像:
尽量用alpine这类体积极小的基础镜像代替ubuntu、centos,能大幅减少镜像本身的体积,比如alpine镜像只有几MB,而ubuntu有几百MB。 - 优化Dockerfile:
- 合并多个RUN命令,减少镜像层数;
- 在安装依赖后清理缓存,比如
apt-get install -y xxx && apt-get clean && rm -rf /var/lib/apt/lists/*; - 使用多阶段构建,只把最终需要的文件复制到生产镜像里,丢弃构建过程中的冗余文件。
- 限制容器磁盘使用:
运行容器时添加--storage-opt size=10G参数,限制容器可使用的磁盘空间,避免单个容器的可写层无限膨胀。 - 用卷存储数据:
不要把业务数据存在容器的可写层里,用-v参数挂载Docker卷或者本地目录,这样容器删除时数据不会留在可写层,也能避免可写层持续膨胀。
内容的提问来源于stack exchange,提问作者Gabriel Henrique




