使用 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 system df
示例:
TYPE TOTAL ACTIVE SIZE
Images 20 5 15GB
Containers 10 3 8GB
Local Volumes 12 6 40GB
Build Cache 10GB
查看:
| 类型 | 说明 |
|---|---|
| Images | Docker 镜像 |
| 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 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:
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 的核心原则:
容器可以删除和重建,但数据必须独立保存。








