稷然如此

  • 首页
  • 文章分类
    • AI
    • Android
    • Java
    • Shell
    • Vue
    • C#
    • Python
    • 数据库
    • 组件
    • 其他
    • Game
  • 常用命令
    • Docker
    • Git
    • Linux
  • 操作系统
    • CentOS
    • Ubuntu
    • Windows
    • Kylin
  • 工具
    • IntelliJ IDEA
    • Visual Studio Code
稷然如此
不积跬步,无以至千里
  1. 首页
  2. 常用命令
  3. Docker
  4. 正文

Docker 磁盘空间清理

2025年11月28日 16点热度 0人点赞

1.Docker 为什么会占用如此大的磁盘空间?

在长期运维实践中,我发现Docker存储空间增长主要有以下几个技术原因:构建缓存(Build Cache)积累: Docker构建过程会缓存每一层,多次迭代构建后,尤其是CI/CD频繁构建的环境,缓存数据可达原始镜像大小的3-5倍。
镜像版本迭代残留: 服务持续部署产生大量历史镜像版本,特别是未使用统一tag策略的环境,常有大量标签的悬空镜像。
容器运行时数据:
  • 已停止但未清理的容器
  • 容器日志无限制增长(尤其是Java应用和微服务架构)
  • 临时容器频繁创建但未及时清理
数据卷(Volumes)管理不当:
数据库等持久化数据卷极易膨胀,即使容器删除,卷仍会保留。
存储驱动特性:
不同存储驱动(如aufs、overlay2)对文件操作的处理机制不同,频繁的文件写入/删除操作会产生大量"空间碎片"。

2.定位磁盘占用

诊断流程:
# 1. 全局概览
docker system df

# 2. 详细分析各组件占用
docker system df -v

# 3. 按大小排序本地镜像
docker images --format "{{.Size}}\t{{.Repository}}:{{.Tag}}" | sort -h -r

# 4. 检查大体积容器(含停止状态)
docker ps -a --size --format "table {{.Names}}\t{{.Image}}\t{{.Size}}" | sort -k3 -h -r

# 5. 分析Docker存储目录真实占用
sudo du -h --max-depth=1 /var/lib/docker | sort -h
运维经验: 在生产环境中,CI/CD流水线频繁构建,但未配置缓存清理策略,3个月内累积了1.2TB的构建缓存,而实际需要保留的仅200GB。精准分析帮助我们避免了简单粗暴的"一刀切"式清理。

3.分等级清理策略

按安全级别排序
1.一级安全清理(生产环境可直接执行)
# 1. 清理已停止的容器(无风险)
docker container prune -f

# 2. 清理悬空镜像(无风险)
docker image prune -f

# 3. 清理未使用的网络(无风险)
docker network prune -f
2.二级谨慎清理(需确认业务影响)
# 1. 清理构建缓存(影响下次构建速度)
docker builder prune -f --filter "until=24h"

# 2. 清理特定时间段未使用的镜像
docker image prune -f --filter "until=720h"  # 30天未使用的镜像
3.三级深度清理(仅限维护窗口期,需完整备份)
# 1. 清理未使用的卷(确认卷内数据已备份或无价值)
docker volume prune -f

# 2. 全面清理(谨慎!)
docker system prune -f --volumes
运维规范: 在生产环境执行清理前,必须:
  • 记录当前系统状态
  • 确认业务低峰期
  • 准备回滚方案
  • 优先在测试环境验证

4.运维级优化实践

1. 建立定期维护机制
# 创建/etc/cron.weekly/docker-cleanup
#!/bin/bash
# 每周日02:00执行
docker builder prune -f --filter "until=168h" > /var/log/docker-cleanup.log 2>&1
docker container prune -f >> /var/log/docker-cleanup.log 2>&1
docker image prune -f --filter "until=168h" >> /var/log/docker-cleanup.log 2>&1
2. 完善Docker守护进程配置
// /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3",
    "compress": "true"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ],
  "live-restore": true,
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 65535,
      "Soft": 65535
    }
  }
}
3.镜像构建优化策略
# 运维推荐的Dockerfile最佳实践
FROM alpine:latest AS builder
# 合并RUN命令,减少层大小
RUN apk add --no-cache build-base && \
    mkdir /app && \
    echo "构建应用" && \
    rm -rf /var/cache/apk/*

FROM alpine:latest
# 仅复制必要文件
COPY --from=builder /app /app
# 设置非root用户运行
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost:8080/health || exit 1
4.建立监控告警体系
# Prometheus监控配置示例
- job_name: 'docker_disk'
  static_configs:
  - targets: ['localhost:9323']
    labels:
      env: production
      cluster: web-apps

# 告警规则
- alert: DockerDiskUsageHigh
  expr: (docker_data_usage_percent > 80)
  for: 1h
  labels:
    severity: warning
  annotations:
    summary: "Docker磁盘使用率过高"
    description: "服务器{{ $labels.instance }}的Docker存储使用率已达{{ $value }}%,建议及时清理"

5.案例分析:

从运维视角解决空间危机
问题背景: 某电商平台K8s节点报警,/var分区使用率达95%。
诊断过程:
确认Docker存储目录位于/var分区
docker system df -v显示构建缓存达450GB
深入分析发现CI/CD流水线每日构建200+次,但无缓存清理策略
解决方案:
紧急清理:保留最近24小时缓存,清理历史缓存
docker builder prune -f --filter "until=24h"
临时扩容: 将/var/lib/docker迁移至独立分区

6.其他

配置Jenkins流水线在构建后自动清理缓存
调整Docker日志限制
建立每周维护任务
部署Prometheus监控Docker存储使用
效果:存储使用率从95%降至45%,系统恢复稳定,并建立了预防机制。
标签: 暂无
最后更新:2025年11月28日

Akim

犇 骉 Java、C#、Python、Go、Android、MiniProgram、Bootstrap、Vue2

点赞
< 上一篇
下一篇 >
文章目录
  • 1.Docker 为什么会占用如此大的磁盘空间?
  • 2.定位磁盘占用
  • 3.分等级清理策略
  • 4.运维级优化实践
  • 5.案例分析:
  • 6.其他

Copyright © 2025 aianran.com All Rights Reserved.

免责申明 | 隐私政策 | 服务条款 | 关于我们

黔ICP备2023008200号-1

贵公网安备 52010202003594号