You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

生产环境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(没有就新建),添加日志限制参数:
    {
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "10m",
        "max-file": "3"
      }
    }
    
    上面的配置是限制每个容器的单个日志文件最大10MB,最多保留3个备份文件,之后重启Docker服务生效: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

火山引擎 最新活动