暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

服务器磁盘爆满,原来是Docker占用过多

运维笔谈 2025-05-04
1189

 


类型
存储位置
描述
镜像(Images)
/var/lib/docker/image/
所有 pull 和 build 的镜像数据
容器(Containers)
/var/lib/docker/containers/
包括日志、配置等
卷(Volumes)
/var/lib/docker/volumes/
数据卷默认存放路径
临时文件、构建缓存
/var/lib/docker/tmp/
/var/lib/docker/buildkit/
构建时产生的中间文件
Overlay2 文件系统
/var/lib/docker/overlay2/
容器实际文件系统的分层存储

💡 我们发现磁盘空间越来越小,很可能是:

  • • 拉取了太多镜像
  • • 创建了很多容器并保留了旧版本
  • • 没有清理停止的容器、未使用的镜像、悬空镜像(dangling images)
  • • 有大体积的日志文件或数据卷没有清理

那么我们应该如何查看 Docker 占用磁盘空间情况?

🔸 查看整体磁盘使用:

df -h

看看哪个分区满了(通常是 /
 或 /var

🔸 查看 Docker 子目录占用空间:

du -sh var/lib/docker/*

输出示例:

100G    /var/lib/docker/overlay2
5.2G    /var/lib/docker/images
1.3G    /var/lib/docker/volumes
...

可以看到哪个部分占用了最多空间。


那么我们又如何进行清理呢?

以下命令可以帮助我们释放磁盘空间:

🧹 1. 清理所有停止的容器

docker container prune

按提示输入 y
 即可

🧹 2. 清理所有未使用的网络

docker network prune

🧹 3. 清理所有未使用的镜像(包括 dangling 镜像)

docker image prune -a

⚠️ 注意:这会删除所有未被容器使用的镜像,慎用!

🧹 4. 清理未使用的卷

docker volume prune

⚠️ 警告:会删除没有容器引用的卷,可能导致数据丢失!

🧹 5. 清理 Build Cache(BuildKit)

docker builder prune --all

我们可以设置一个定时任务,比如每天凌晨清理一次 Docker 垃圾:

# 编辑 crontab
crontab -e

添加以下内容:

0 3 * * * docker container prune -f && docker image prune -af && docker volume prune -f && docker network prune -f

这个定时任务会在每天凌晨 3 点自动清理无用资源。


如何避免再次出现磁盘满的问题?

方法
说明
使用 --prune
 定期清理
构建完自动清理缓存
控制日志大小
设置 max-size 日志限制
不要频繁 commit 容器打标签
会产生多个镜像层
使用轻量级基础镜像
如 Alpine、distroless
定期监控磁盘使用
可用 node_exporter + Prometheus
 监控

查看哪些容器产生了大量日志

cd /var/lib/docker/containers
du -sh */*.log

如若某个容器的日志已经超过几个 GB。
可以这样控制日志大小(在 docker run
 时指定):

docker run --log-opt max-size=10m --log-opt max-file=3 ...

 

我把收集的一些IT运维资料做了关键字回复,可以获取云盘下载地址。

文章转载自运维笔谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论