欢迎光临
我们一直在努力

Docker 磁盘占满怎么办?清理镜像、日志和无用资源教程

使用 Docker 部署网站、数据库、面板和各种自托管服务时,经常会遇到一个问题:

刚安装时服务器空间充足,运行几个月以后,磁盘使用率越来越高。

查看服务器:

df -h

发现系统盘已经接近满载。

很多用户第一反应是:

  • 删除旧镜像
  • 删除 Docker 目录
  • 直接清理 /var/lib/docker

但 Docker 存储结构比较复杂。

磁盘占用可能来自:

  • Docker 镜像
  • 停止的容器
  • 容器日志
  • Build Cache
  • 数据卷
  • overlay2 文件系统
  • 应用产生的数据

如果不了解来源直接删除,可能导致:

  • 数据库损坏
  • 网站文件丢失
  • Immich 图片丢失
  • WordPress 上传文件消失
  • 容器无法启动

因此清理 Docker 前应该:

先查看占用来源,再针对性处理。


一、Docker 为什么会占满磁盘?

Docker 常见占用来源包括:

1. 镜像不断累积

例如:

更新应用:

docker pull nginx:new

旧版本镜像可能仍然保留。

长期运行:

  • nginx
  • mysql
  • redis
  • wordpress
  • 各类应用镜像

容易积累大量无用镜像。


2. 停止容器没有删除

查看:

docker ps -a

可以看到:

  • 正在运行容器
  • 已停止容器

测试项目、旧版本服务停止以后,如果没有清理,也会继续占用空间。


3. Docker 日志持续增长

Docker 默认使用:

json-file

保存容器日志。

如果某个程序不断输出:

  • 错误日志
  • 请求日志
  • 调试信息

日志文件可能增长到几十 GB 甚至更多。


4. Build Cache 累积

如果经常执行:

docker build

Docker 会保存构建缓存。

适合:

  • 开发环境
  • CI/CD

但长期运行的服务器可能积累大量缓存。


5. Volume 数据增长

Docker Volume 经常保存:

  • MySQL 数据库
  • PostgreSQL 数据库
  • WordPress 文件
  • Immich 图片
  • Nextcloud 文件

这部分通常最重要。

不能因为 Docker 显示占用大,就直接删除。


二、查看 Docker 当前磁盘占用

Docker使用docker system df查看磁盘空间占用

首先执行:

docker system df

示例:

TYPE            TOTAL     ACTIVE    SIZE
Images          20        5         15GB
Containers      10        3         8GB
Local Volumes   12        6         40GB
Build Cache                         10GB

查看:

类型说明
ImagesDocker 镜像
Containers容器可写层
Local Volumes数据卷
Build Cache构建缓存

如果:

Local Volumes

占用最大,通常说明数据保存在 Volume 中。

如果:

Images

占用最大,则可能存在大量旧镜像。


三、查看 Docker 详细空间占用

可以使用:

docker system df -v

相比:

docker system df

会显示更详细的信息。

例如:

  • 哪些镜像占空间
  • 哪些 Volume 最大
  • 哪些容器占用数据

排查时建议优先执行:

docker system df -v

不要一开始直接清理。


四、清理停止的 Docker 容器

查看全部容器:

docker ps -a

示例:

CONTAINER ID   IMAGE       STATUS
abc123         nginx       Exited
def456         mysql       Up

删除指定停止容器:

docker rm 容器ID

批量清理停止容器:

docker container prune

执行后会提示确认。

注意:

该命令只删除:

  • 已停止容器

不会删除:

  • 运行中的容器
  • 数据卷

但是删除前仍建议确认是否需要恢复旧容器配置。


五、清理无用 Docker 镜像

查看镜像:

docker images

示例:

REPOSITORY   TAG       IMAGE ID
nginx        old       abc123
nginx        latest    def456

删除指定镜像:

docker rmi 镜像ID

清理悬空镜像:

docker image prune

例如:

<none>:<none>

这类镜像通常来自:

  • 构建失败
  • 镜像更新
  • 中间版本

六、删除所有未使用镜像

Docker使用prune命令清理无用镜像释放磁盘空间

执行:

docker image prune -a

和:

docker image prune

区别:

命令删除范围
docker image prune删除悬空镜像
docker image prune -a删除所有未被使用镜像

例如:

当前没有容器使用:

nginx:1.20

执行:

docker image prune -a

可能会删除它。

生产环境执行前需要确认。


七、清理 Docker Build Cache

查看 Build Cache:

docker system df

清理:

docker builder prune

如果确认全部缓存都可以删除:

docker builder prune -a

适合:

  • 经常编译镜像
  • CI/CD服务器
  • 测试环境

生产服务器如果经常更新镜像,可以定期清理。


八、Docker 日志占满磁盘怎么办?

这是最容易忽略的问题。

查看容器日志路径:

docker inspect --format='{{.LogPath}}' 容器名称

例如:

/var/lib/docker/containers/xxx/xxx-json.log

查看大小:

du -h 日志文件路径

如果发现:

20G
50G
100G

通常就是日志导致。


九、限制 Docker 容器日志大小

Docker Compose配置日志限制避免容器日志占满磁盘

推荐长期配置日志轮转。

Docker Compose:

logging:
  driver: json-file
  options:
    max-size: "100m"
    max-file: "3"

含义:

单个日志最大:

100MB

最多保留:

3个文件

例如:

container.log
container.log.1
container.log.2

避免日志无限增长。

修改以后需要重新创建容器:

docker compose up -d

十、手动清理 Docker 超大日志

如果日志已经占满磁盘,需要立即释放空间。

找到日志文件:

docker inspect --format='{{.LogPath}}' 容器名称

确认后,可以清空:

truncate -s 0 日志文件

例如:

truncate -s 0 /var/lib/docker/containers/xxx/xxx-json.log

注意:

不要直接删除:

rm 日志文件

因为 Docker 进程可能仍然保持文件句柄。

清空文件比删除文件更安全。


十一、检查 Docker Volume 占用

查看 Volume:

docker volume ls

查看详情:

docker volume inspect 卷名称

Volume 可能保存:

  • 数据库
  • 图片
  • 用户文件
  • 应用配置

例如:

Immich:

照片库

MySQL:

数据库文件

WordPress:

上传文件

不要直接执行:

docker volume prune

十二、清理无用 Docker Volume

查看 Volume:

docker volume ls

确认没有使用后:

docker volume prune

会删除:

没有任何容器引用的数据卷。

但是:

“没有容器引用”

不代表:

“没有价值”。

例如:

旧项目停止后,数据卷可能仍然保存:

  • 网站数据
  • 数据库备份
  • 用户文件

删除前必须确认。


十三、overlay2 占用大量空间怎么办?

Docker 默认存储目录:

/var/lib/docker

其中:

overlay2

通常占用较大。

查看:

du -sh /var/lib/docker/*

可能看到:

overlay2   50G
volumes    100G
containers 20G

说明:

overlay2:

镜像和容器文件层。

volumes:

持久化数据。

containers:

容器日志等。

不要直接执行:

rm -rf /var/lib/docker

否则可能导致:

  • 所有镜像丢失
  • 容器无法启动
  • 数据损坏

十四、Docker 数据盘和系统盘如何规划?

生产环境建议:

系统盘:

保存:

  • Docker程序
  • 系统文件
  • 配置

数据盘:

保存:

  • MySQL
  • PostgreSQL
  • Immich
  • Nextcloud
  • 网站上传文件

例如:

系统盘
/

数据盘
/data/docker

然后通过:

Volume

或者:

bind mount

挂载。

这样可以避免:

应用数据快速增长导致系统盘被占满。


十五、Docker 磁盘清理快速排查表

问题检查
Docker占用大docker system df
镜像过多docker images
停止容器多docker ps -a
日志太大docker inspect LogPath
Volume太大docker volume ls
Build缓存大docker builder prune
overlay2大/var/lib/docker
磁盘满但找不到文件lsof deleted

推荐顺序:

docker system df → 镜像 → 容器 → 日志 → Volume → overlay2


十六、如何避免 Docker 再次占满磁盘?

建议:

1. 设置日志限制

避免:

json.log

无限增长。


2. 定期清理镜像

删除:

  • 老版本镜像
  • 测试镜像
  • 无用缓存

3. 数据独立存储

数据库、图片、上传文件不要全部放系统盘。


4. 增加磁盘监控

提前发现:

  • 80%
  • 90%

磁盘告警。


总结

Docker 磁盘占满时,不建议直接删除:

/var/lib/docker

正确排查方式:

首先查看:

docker system df

确认空间来源。

然后分别检查:

  • 镜像
  • 停止容器
  • Build Cache
  • 日志
  • Volume

如果发现日志占用:

配置:

max-size
max-file

限制增长。

如果发现 Volume 占用:

先确认数据价值,再决定是否删除。

Docker 的核心原则:

容器可以删除和重建,但数据必须独立保存。

赞(0)
未经允许不得转载:莱卡云 » Docker 磁盘占满怎么办?清理镜像、日志和无用资源教程