Prometheus+cAdvisor可实现Docker磁盘用量精准监控与分级告警:通过container_fs_usage_bytes等指标聚合宿主机维度数据,结合rate分析增长趋势,分层配置85%预警与95%紧急告警,并联动registry GC、日志清理及构建缓存管理形成闭环响应。

删除镜像本身不会立刻释放磁盘空间,所以单靠“删了镜像”不能解决空间告警问题。真正要做的,是建立一套能提前感知、准确定位、自动响应的监控告警闭环——重点不是“删没删”,而是“剩多少”“谁在涨”“什么时候该干预”。
用 Prometheus + cAdvisor 抓准 Docker 磁盘用量
cAdvisor 默认暴露容器和镜像层的存储指标,配合 Prometheus 可以直接采集 container_fs_usage_bytes 和 container_fs_limit_bytes。关键不是看单个容器,而是聚合到宿主机维度:
- 查 registry 存储目录实际占用:
node_filesystem_size_bytes{mountpoint="/var/lib/registry/storage"} - node_filesystem_free_bytes{mountpoint="/var/lib/registry/storage"} - 查所有 Docker 相关路径总用量:
sum(container_fs_usage_bytes{device=~".*docker.*|.*overlay.*"}) by (instance) - 加一层 rate:观察 1 小时内增长量是否超过 2GB,比绝对值更早发现问题
配置精准告警规则,避免“狼来了”
只设一个“磁盘 >90%”太粗放,容易漏掉局部暴增。建议分层设规则:
-
预警级(85%):
node_filesystem_usage_percent{mountpoint="/var/lib/registry"} > 85,触发 Slack 通知,提醒人工核查 -
紧急级(95%):
rate(node_filesystem_avail_bytes{mountpoint="/var/lib/registry"}[1h]) ,表示 1 小时掉空间超 500MB,自动触发清理脚本 -
异常波动级:
stddev_over_time(container_fs_usage_bytes{image!=""}[6h]) / avg_over_time(container_fs_usage_bytes{image!=""}[6h]) > 0.4,识别某镜像层突增(比如日志写爆或构建缓存疯长)
给 registry 配上 GC 告警与自动执行
registry 默认不启用物理删除,删 manifest 后 blob 还在。必须确认两个配置已开启:
-
delete.enabled: true(开放 DELETE API) -
storage.delete.enabled: true(允许真正删 blob)
然后加一条专项检查:每 15 分钟调一次 curl -X GET http://registry:5000/v2/_catalog?n=1,再结合 du -sh /var/lib/registry/storage/blobs 对比。如果 catalog 条目减少但 blobs 大小不变,说明 GC 没生效,立即告警并触发 registry garbage-collect /etc/docker/registry/config.yml。
日志和构建缓存也要纳入同一监控视图
60GB 日志吃满磁盘的案例很常见,但它和镜像空间是两套路径。统一监控才能避免顾此失彼:
- 容器日志:监控
/var/lib/docker/containers/**/*-json.log总大小,用du -sh /var/lib/docker/containers/*/ | sort -hr | head -5定位大户 - 构建缓存:
docker system df -v中的 “Build cache” 行,定期采集docker builder prune -f --filter until=24h执行结果 - 在 Grafana 里把 registry 存储、容器日志目录、build cache 画在同一张趋势图,标出
docker system prune -af的执行时间点,一目了然效果


















