Docker 使用与磁盘空间排查文档
适用场景:Linux 云服务器使用 Docker 部署服务后,系统盘空间突然不足,尤其是
/分区接近 100% 的情况。
1. 问题背景
服务器出现存储空间不足时,常见现象包括:
- 程序无法正常写入文件
- Docker 容器启动失败
- 数据库写入失败
- 日志无法继续生成
- 系统提示
No space left on device df -h显示根分区/使用率过高
示例:
1root@VM-0-14-ubuntu:~# df -h 2Filesystem Size Used Avail Use% Mounted on 3/dev/vda2 50G 46G 1.3G 98% / 4overlay 50G 46G 1.3G 98% /var/lib/docker/rootfs/overlayfs/xxx
这说明:
- 系统盘
/已经接近满载 - Docker 的 overlay 文件系统也挂载在系统盘下
- Docker 镜像、构建缓存或容器日志很可能占用了大量空间
2. 查看磁盘空间
2.1 查看整体磁盘使用情况
1df -h
重点关注:
1Filesystem Size Used Avail Use% Mounted on 2/dev/vda2 50G 46G 1.3G 98% /
其中:
| 字段 | 含义 |
|---|---|
| Size | 分区总大小 |
| Used | 已使用空间 |
| Avail | 剩余可用空间 |
| Use% | 使用率 |
| Mounted on | 挂载位置 |
如果 / 分区使用率超过 90%,就需要排查和清理。
3. 定位哪个目录占用空间最大
3.1 查看根目录下各目录大小
1sudo du -h --max-depth=1 / 2>/dev/null | sort -hr | head -20
常见大目录:
1/var 2/home 3/usr 4/root 5/opt
如果 /var 很大,继续查看:
1sudo du -h --max-depth=1 /var 2>/dev/null | sort -hr | head -20
Docker 默认数据目录通常在:
1/var/lib/docker
查看 Docker 目录占用:
1sudo du -h --max-depth=1 /var/lib/docker 2>/dev/null | sort -hr | head -20
4. 查看 Docker 空间占用
4.1 Docker 空间统计
1docker system df
示例输出:
1TYPE TOTAL ACTIVE SIZE RECLAIMABLE 2Images 11 1 38.72GB 17.22GB (44%) 3Containers 1 1 23.86MB 0B (0%) 4Local Volumes 0 0 0B 0B 5Build Cache 122 0 21.11GB 18.87GB
含义:
| 类型 | 含义 |
|---|---|
| Images | Docker 镜像占用 |
| Containers | 容器占用 |
| Local Volumes | Docker 数据卷占用 |
| Build Cache | 镜像构建缓存占用 |
| RECLAIMABLE | 可回收空间 |
从示例可以看出:
- 镜像占用:38.72GB
- 可回收镜像空间:17.22GB
- 构建缓存占用:21.11GB
- 可回收构建缓存:18.87GB
因此,Docker 是主要占用来源。
5. 清理 Docker 构建缓存
5.1 推荐优先清理 Build Cache
构建缓存通常是最安全、最值得优先清理的对象。
1docker builder prune
执行后会提示确认,输入:
1y
如果想清理所有未使用构建缓存:
1docker builder prune -a
说明:
- 不会删除正在运行的容器
- 不会删除数据卷
- 主要删除构建镜像时产生的缓存
- 下次构建镜像可能变慢,但不会影响已有容器运行
清理后检查:
1df -h 2docker system df
6. 清理未使用镜像
6.1 查看镜像列表
1docker images
6.2 删除未使用镜像
1docker image prune -a
说明:
- 会删除没有被任何容器使用的镜像
- 不会删除当前正在运行容器所依赖的镜像
- 如果以后需要旧镜像,可能需要重新拉取或重新构建
7. 一键清理 Docker 无用资源
如果希望一次性清理未使用的容器、镜像、网络和构建缓存,可以执行:
1docker system prune -a
它会清理:
- 停止的容器
- 未使用的网络
- 未被容器使用的镜像
- 构建缓存
它默认不会删除 Docker volume。
执行后检查空间:
1df -h 2docker system df
8. 谨慎使用的危险命令
不要随便执行:
1docker system prune -a --volumes
原因:
--volumes会删除未使用的数据卷- 数据库数据、用户上传文件、业务持久化数据可能存在 volume 中
- 一旦删除,可能造成数据丢失
即使当前显示:
1Local Volumes 0 0 0B 0B
也不建议养成随手加 --volumes 的习惯。
9. 排查 Docker 容器日志
有时候空间不是镜像占用,而是容器日志暴涨。
9.1 查找大日志文件
1sudo find /var/lib/docker/containers -name "*-json.log" -exec ls -lh {} \; | sort -k 5 -hr | head -20
如果看到几个 GB 或十几个 GB 的日志文件,可以清空。
9.2 清空容器日志
1sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log
说明:
- 这只是清空日志内容
- 不会删除容器
- 不会删除业务数据
- 一般比较安全
10. 限制 Docker 日志大小
为了防止容器日志再次占满磁盘,可以配置 Docker 日志轮转。
编辑 Docker 配置文件:
1sudo nano /etc/docker/daemon.json
写入:
1{ 2 "log-driver": "json-file", 3 "log-opts": { 4 "max-size": "100m", 5 "max-file": "3" 6 } 7}
含义:
- 单个日志文件最大 100MB
- 最多保留 3 个日志文件
- 每个容器最多约占用 300MB 日志空间
重启 Docker:
1sudo systemctl restart docker
注意:
- 重启 Docker 可能会影响正在运行的容器
- 如果容器没有配置自动重启,重启 Docker 后需要手动启动容器
查看容器状态:
1docker ps -a
启动容器:
1docker start 容器名或容器ID
11. 常用 Docker 运维命令
11.1 查看运行中的容器
1docker ps
11.2 查看所有容器
1docker ps -a
11.3 查看镜像
1docker images
11.4 查看 Docker 占用
1docker system df
11.5 查看容器实时资源占用
1docker stats
11.6 查看容器日志
1docker logs --tail=200 容器名或容器ID
11.7 重启容器
1docker restart 容器名或容器ID
11.8 停止容器
1docker stop 容器名或容器ID
11.9 删除停止的容器
1docker container prune
12. 推荐清理流程
当服务器磁盘空间快满时,推荐按以下顺序处理。
第一步:查看磁盘
1df -h
第二步:查看 Docker 占用
1docker system df
第三步:优先清理构建缓存
1docker builder prune -a
第四步:清理未使用镜像
1docker image prune -a
第五步:检查是否有巨大容器日志
1sudo find /var/lib/docker/containers -name "*-json.log" -exec ls -lh {} \; | sort -k 5 -hr | head -20
如有需要,清空日志:
1sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log
第六步:再次检查空间
1df -h 2docker system df
13. 本次问题结论
根据本次服务器输出:
1Images 11 1 38.72GB 17.22GB (44%) 2Build Cache 122 0 21.11GB 18.87GB
判断结果:
- 系统盘
/只有 50GB - Docker 镜像占用了约 38.72GB
- Docker 构建缓存占用了约 21.11GB
- Docker 可回收空间超过 30GB
- 主要问题不是运行内存不足,而是磁盘存储空间不足
优先建议执行:
1docker builder prune -a
然后执行:
1docker image prune -a
最后检查:
1df -h 2docker system df
14. 长期维护建议
14.1 定期清理构建缓存
1docker builder prune -a
14.2 只清理 7 天前的构建缓存
1docker builder prune -a --filter "until=168h"
14.3 限制 buildx 缓存大小
1docker buildx prune --keep-storage 5GB
14.4 配置日志轮转
1sudo nano /etc/docker/daemon.json
内容:
1{ 2 "log-driver": "json-file", 3 "log-opts": { 4 "max-size": "100m", 5 "max-file": "3" 6 } 7}
重启 Docker:
1sudo systemctl restart docker
15. 不建议直接删除的目录
除非非常确定,否则不要直接删除以下目录:
1/var/lib/docker/volumes 2/var/lib/mysql 3/var/lib/postgresql 4/home 5/root 6/opt
原因:
- 可能包含数据库数据
- 可能包含用户上传文件
- 可能包含项目代码
- 可能包含部署配置
- 误删后恢复困难
如果必须删除,应先备份或确认内容。
16. 快速命令清单
1# 查看磁盘空间 2df -h 3 4# 查看根目录占用 5sudo du -h --max-depth=1 / 2>/dev/null | sort -hr | head -20 6 7# 查看 Docker 占用 8docker system df 9 10# 清理 Docker 构建缓存 11docker builder prune -a 12 13# 清理未使用镜像 14docker image prune -a 15 16# 一键清理未使用 Docker 资源,不包含 volume 17docker system prune -a 18 19# 查找 Docker 容器日志 20sudo find /var/lib/docker/containers -name "*-json.log" -exec ls -lh {} \; | sort -k 5 -hr | head -20 21 22# 清空 Docker 容器日志 23sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log 24 25# 查看清理后的空间 26df -h 27docker system df
17. 简短结论
这类问题的核心排查思路是:
1先看 df -h → 再看 docker system df → 优先清理 Build Cache → 再清理未使用镜像 → 最后处理日志和长期配置
本次问题最可能的直接解决命令是:
1docker builder prune -a
如果仍然空间不足,再执行:
1docker image prune -a