分析 Docker 磁盘占用

以下是分析 Docker 磁盘占用的详细步骤和工具指南,帮助开发者快速定位和清理冗余数据:

1. 查看 Docker 磁盘使用概览

docker system df

输出说明

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          15        10        5.2GB     1.1GB (21%)
Containers      12        5         1.3GB     800MB (61%)
Local Volumes   7         3         2.5GB     1.8GB (72%)
Build Cache     45        0         3.7GB     3.7GB (100%)

各部分含义解析

1)Images(镜像)

  • TOTAL:系统中存在的镜像总数(包括中间层镜像)。
  • ACTIVE:当前被容器使用的镜像数量。
  • SIZE:所有镜像占用的总磁盘空间。
  • RECLAIMABLE:可回收的镜像空间(未被任何容器使用的镜像)。示例:1.234GB(52%)表示可以通过 docker image prune 释放 1.234GB,占总镜像空间的 52%。

2)Containers(容器)

  • TOTAL:系统中存在的容器总数(包括已停止的容器)。
  • ACTIVE:当前正在运行的容器数量。
  • SIZE:所有容器的可写层占用的总空间(容器内文件的变更)。
  • RECLAIMABLE:已停止容器的可写层空间。示例:100.2MB(81%)表示可以通过 docker container prune 释放 100.2MB。

3)Local Volumes(本地卷)

  • TOTAL:系统中存在的本地卷总数。
  • ACTIVE:当前被容器挂载的卷数量。
  • SIZE:所有卷占用的总磁盘空间。
  • RECLAIMABLE:未被任何容器使用的卷空间。示例:456.7MB(80%)表示可以通过 docker volume prune 释放 456.7MB。

4)Build Cache(构建缓存)

  • TOTAL:Docker 构建过程中创建的缓存层总数。
  • ACTIVE:当前被新构建复用的缓存层数量。
  • SIZE:所有构建缓存占用的总空间。
  • RECLAIMABLE:未被使用的缓存空间(默认全部可回收)。示例:3.456GB(100%)表示可以通过 docker builder prune 释放全部缓存。

2. 定位具体占用项

(1) 镜像占用分析
# 列出所有镜像(按大小排序)
docker images --format "{{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}" | sort -k 4 -h -r# 查看悬空镜像(未被任何容器引用的中间层)
docker images --filter "dangling=true"
(2) 容器占用分析
# 列出所有容器(包括已停止的,显示磁盘占用)
docker ps -a --size

输出关键列

  • SIZE: 容器可写层大小(增量修改)。

  • VIRTUAL SIZE: 容器关联镜像的总大小。

(3) 数据卷占用分析
# 列出所有数据卷
docker volume ls# 查看数据卷详情(包括挂载点和占用空间)
docker system df -v
(4) 构建缓存分析
# 查看构建缓存(包括未使用的中间层)
docker builder prune --dry-run
(5) 日志文件分析
# 查看容器日志文件占用(默认路径)
sudo du -sh /var/lib/docker/containers/*/*-json.log# 查看单个容器的日志大小
docker logs <容器名> --since 1h | wc -c  # 统计最近1小时的日志大小

3. 清理策略

(1) 清理未使用的镜像
# 删除悬空镜像
docker image prune# 删除未被容器引用的所有镜像
docker image prune -a
(2) 清理停止的容器
# 删除所有已停止的容器
docker container prune# 删除指定条件的容器(如退出状态为0的)
docker rm $(docker ps -aq --filter "status=exited")
(3) 清理数据卷
# 删除未使用的数据卷
docker volume prune
(4) 清理构建缓存
# 删除所有构建缓存
docker builder prune --all
(5) 清理日志文件
  • 手动清理

    # 清空日志文件(不删除文件)
    truncate -s 0 /var/lib/docker/containers/<容器ID>/*-json.log
  • 自动轮转
    在容器启动时限制日志大小(docker run 或 docker-compose.yml):

    logging:driver: "json-file"options:max-size: "10m"   # 单个日志文件最大10MBmax-file: "3"      # 最多保留3个日志文件

4. 深度分析工具

(1) 可视化工具 - dive

分析镜像层内容,定位大文件:

# 安装 dive
curl -sS https://webinstall.dev/dive | bash# 分析镜像
dive <镜像名>
(2) 目录分析工具 - ncdu

扫描 Docker 存储目录:

# 安装 ncdu
sudo apt install ncdu# 分析 Docker 数据目录
sudo ncdu /var/lib/docker

5. 预防磁盘占满

(1) 配置 Docker 存储驱动

编辑 /etc/docker/daemon.json,限制存储大小(适用于 devicemapper 或 overlay2):

{"storage-driver": "overlay2","storage-opts": ["overlay2.size=20G"  # 限制存储池大小]
}
(2) 监控告警
  • 使用 cAdvisor + Prometheus + Grafana 监控 Docker 资源。

  • 设置磁盘空间阈值告警(如超过 80% 触发清理脚本)。

6. 常见问题

问题 1:/var/lib/docker 占用过大

原因:镜像层、日志或未清理的容器堆积。

解决

# 清理所有未使用的 Docker 资源
docker system prune --all --volumes
问题 2:容器日志持续增长

原因:未配置日志轮转或应用日志输出过多。

解决:配置 max-size 和 max-file 参数,或改用非阻塞日志驱动(如 journald)。

7. 注意事项

谨慎使用 -a 标志prune -a 会删除所有未使用的资源(如镜像、缓存),可能导致后续构建或部署变慢。

监控关键资源:重点关注 Build Cache 的大小,尤其是频繁进行 Docker 构建的环境。

生产环境慎用:在生产环境清理资源前,建议先备份重要数据,避免意外删除。

总结

资源类型占用位置清理命令
镜像/var/lib/docker/imagedocker image prune -a
容器/var/lib/docker/containersdocker container prune
数据卷/var/lib/docker/volumesdocker volume prune
日志容器日志文件配置日志轮转

通过定期检查(如每周执行 docker system prune)和合理配置,可有效控制 Docker 磁盘占用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/82123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊一聊接口测试中的参数化测试

目录 一、核心概念 二、适用场景 三、参数化测试的核心目的 四、实现参数化测试的关键步骤 4.1 定义测试数据 4.2 使用测试框架参数化功能 4.3 执行测试与结果分析 五、最佳实践与注意事项 六、工具推荐 那参数化测试的目的是什么&#xff1f;应该是为了提高测试覆盖率…

Go语言——string、数组、切片以及map

一、string、数组、切片代码 package mainimport "fmt"// 定义结构体 type student struct {id intname stringage intscore float32 }func main() {// 使用var声明切片var slice1 []intslice1 append(slice1, 1)slice1 append(slice1, 2)slice1 append(sl…

Android 开发中JDK 的使用和配置详解

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。 👉点击跳转到教程 在安卓开发中, 我们会使用到Java的JDK, JDK全程为(Java Development Kit)意思是:Java开发工具包。那么JDK 与我们的…

MPay码支付系统第四方聚合收款码多款支付插件个人免签支付源码TP8框架全开源

一、源码描述 这是一套码支付源码&#xff08;MPay&#xff09;&#xff0c;基于TP8框架&#xff0c;前端layui2.9后端PearAdmin&#xff0c;专注于个人免签收款&#xff0c;通过个人的普通收款码&#xff0c;即可实现收款通知自动回调&#xff0c;支持绝大多数商城系统&#…

国产数据库铸就数字基建新基石,助力农业产业转型升级

中国科技企业以自主创新突破技术壁垒&#xff0c;为全球产业链重构注入新动能。广东辰宜信息科技有限公司&#xff08;以下简称“辰宜科技”&#xff09;凭借自主研发的“博流分布式多模数据库”等核心技术&#xff0c;作为支持数据流通的关键技术支撑&#xff0c;实现中国基础…

《人工智能:如何重塑教育模式与学习图景》

《人工智能&#xff1a;如何重塑教育模式与学习图景》 引言 人工智能&#xff0c;特别是大型语言模型&#xff08;如GPT-4/ChatGPT&#xff09;&#xff0c;正以前所未有的速度影响教育领域。从基础教育到高等教育&#xff0c;再到职业教育&#xff0c;传统教学模式正在被重新审…

硬件工程师面试常见问题(14)

第六十六问&#xff1a;运放--输入偏置电流和输入失调电流 输入偏置电流lb&#xff1a;是由于运放两个输入极都有漏电流的存在。实际的运放,会有电流流入运放的输入端的。那么输入偏置电流就定义这两个电流的平均值。 输入失调电流 Ios&#xff1a;定义为两个差分输入端偏置电…

Docker+Kubernetes落地指南:从单机到集群的平滑迁移

一、为何必须升级到Kubernetes&#xff1f; 1.1 单机Docker的瓶颈 单机环境痛点&#xff1a; ├─ 资源利用率不均衡&#xff08;CPU飙高 vs 内存闲置&#xff09; ├─ 服务扩容需手动操作 ├─ 零宕机更新难以实现 └─ 网络配置复杂&#xff08;跨主机通信困难&am…

HttpPrinter 是一款功能强大的跨平台 Web 打印解决方案

HttpPrinter 是一款功能强大的跨平台 Web 打印解决方案&#xff0c;支持多种编程语言和打印场景&#xff0c;适用于企业级报表打印、静默打印、远程打印等需求。以下是其核心功能、技术特点及使用方法的综合分析&#xff1a; 一、核心功能与特点 跨平台与多语言支持 支持 Java…

Selenium Web自动化测试学习笔记(一)

自动化测试 技术手段模拟人工&#xff0c;执行重复性任务&#xff0c;准确率100%&#xff0c;高于人工 selenium 可通过浏览器驱动控制浏览器&#xff0c;通过元素定位模拟人工&#xff0c;实现web自动化&#xff0c;没有焦点&#xff08;把浏览器放在最小化依然可以&#x…

TikTok 矩阵运营新手实操保姆级教程 2.0 版本

在当下这个全球化的数字浪潮中&#xff0c;TikTok 这片充满机遇的流量蓝海&#xff0c;正吸引着无数创业者和品牌方争相角逐。而要想在这激烈的竞争中脱颖而出&#xff0c;TikTok 矩阵运营无疑是至关重要的制胜法宝。今天&#xff0c;就给大家送上这份超实用的新手实操教程&…

使用DeepSeek协助恢复历史数据

最近&#xff0c;工作中遇到比较老的数据库备份文件数据恢复的问题。过程中使用DeepSeek分析&#xff0c;很快的解决了从除备份文件本身其他信息一概不知的条件下&#xff0c;数据库选型问题和环境搭建问题。下面把实施过程分享出来&#xff0c;给其他遇到相同问题的小伙伴提供…

【特殊场景应对6】频繁跳槽:行业特性与稳定性危机的解释边界

写在最前 作为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offe…

企业智能化第一步:用「Deepseek+自动化」打造企业资源管理的智能中枢

随着Deepseek乃至AI人工智能技术在企业中得到了广泛的关注和使用&#xff0c;多数企业开始了AI探索之旅&#xff0c;迅易科技也不例外&#xff0c;且在不断地实践中强化了AI智能应用创新的强大能力。 为解决企业知识管理碎片化、提高内部工作效率等问题&#xff0c;迅易将目光放…

大连理工大学选修课——图形学:第三四章 基本图形生成算法

第三四章 基本图形生成算法 图形生成 概念&#xff1a;如何在指定的输出设备上&#xff0c;根据坐标描述&#xff0c;构造基本二维几何图形 基本二维几何图形&#xff1a;点、直线、圆、多边形域、字符串及相关属性等。 图形生成的概念 是在指定的输出设备上&#xff0c;根…

怎样避免住宅IP被平台识别

要有效避免住宅IP被平台识别&#xff0c;需从IP质量选择、环境参数伪装、行为模式模拟、技术细节处理等多维度构建防御体系。以下是基于行业实践的综合性解决方案&#xff1a; 一、确保住宅IP的高纯净度 选择真实家庭网络IP 验证IP是否归属真实家庭宽带&#xff08;非机房IP伪装…

WPF 触发器 Trigger

触发器 Trigger 触发器&#xff08;Trigger&#xff09;是 WPF 中的一种机制&#xff1a; 当某个条件满足时&#xff0c;自动改变控件的某些属性&#xff0c;比如颜色、大小、透明度等。 换句话说&#xff0c;就是"如果……那么就……" 的一种规则。 常见触发器类…

NLP核心技术解析:大模型与分词工具的协同工作原理

文章目录 一、核心关系概述二、分词工具的核心作用三、未登录词&#xff08;OOV&#xff09;问题3.1 问题本质分析3.2 解决方案3.2.1 预对齐词汇表&#xff08;最优解&#xff09;3.2.2 子词回退策略3.2.3 词汇表扩展&#xff08;适合专业领域&#xff09; 3.3 技术选型建议3.4…

vscode预览模式(点击文件时默认覆盖当前标签,标签名称显示为斜体,可通过双击该标签取消)覆盖标签、新窗打开

文章目录 VS Code 预览模式如何取消预览模式&#xff08;即“固定”标签页&#xff09;&#xff1f;预览模式有什么用&#xff1f; VS Code 预览模式 在 VS Code 中&#xff0c;当你单击文件浏览器&#xff08;例如&#xff0c;资源管理器侧边栏&#xff09;中的某个文件时&am…

MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - user/_sleep 是什么?做什么?

接上文 MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep 是怎样练成的&#xff1f; user/_sleep 是什么&#xff1f; book-riscv-rev3.pdf 3.8节有对Xv6 binary文件的格式描述 Xv6 binaries are formatted in the widely-used ELF format, defined in (kernel/elf.h). An …