Docker 运行一段时间后,/var/lib/docker/overlay2(或 overlay)目录占用空间过大是一个常见问题。这通常由以下原因导致:
-
镜像层累积:拉取新镜像时旧镜像未被清理
-
构建缓存:Dockerfile 构建产生的中间层
-
停止的容器:已停止但未删除的容器占用层
-
卷(Volumes):未使用的数据卷
-
日志文件:容器日志无限增长
1. 快速清理命令(推荐)
bash
复制
# 清理所有未使用的数据(容器、镜像、卷、网络、缓存)
docker system prune -a --volumes
# 仅清理未使用的镜像
docker image prune -a
# 仅清理已停止的容器
docker container prune
# 仅清理未使用的卷(谨慎使用)
docker volume prune
注意 :-a 会删除所有未使用的镜像,不仅仅是悬空镜像。
2. 查看空间占用详情
bash
复制
# 查看 Docker 整体磁盘使用情况
docker system df -v
# 查看 overlay2 目录大小
du -sh /var/lib/docker/overlay2
# 查找大文件
du -h /var/lib/docker/overlay2 | sort -rh | head -20
3. 定位具体占用源
bash
复制
# 查看哪些容器占用最多空间
docker ps -s
# 查看镜像大小排序
docker images --format "{{.Size}} {{.Repository}}:{{.Tag}}" | sort -hr
# 查找孤儿卷(无容器使用)
docker volume ls -f dangling=true
4. 针对性解决方案
清理特定镜像/容器
bash
复制
# 删除特定镜像
docker rmi <image_id>
# 强制删除运行中的容器及其卷
docker rm -vf <container_id>
限制日志大小(治本)
编辑 /etc/docker/daemon.json:
JSON
复制
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
然后重启 Docker:sudo systemctl restart docker
清理构建缓存
bash
复制
docker builder prune
5. 自动化清理脚本
可以添加到 crontab 定期执行:
bash
复制
#!/bin/bash
# docker-cleanup.sh
docker system prune -af --volumes --filter "until=168h" # 清理7天前的数据
6. 迁移 Docker 目录(空间不足时)
如果磁盘空间确实不足,可以迁移数据目录:
bash
复制
# 停止 Docker
sudo systemctl stop docker
# 迁移数据
sudo rsync -avz /var/lib/docker/ /new/path/docker/
# 修改配置 /etc/docker/daemon.json
{
"data-root": "/new/path/docker"
}
# 重启 Docker
sudo systemctl start docker
建议的清理顺序
-
先执行
docker system df查看占用分布 -
先清理 已停止的容器:
docker container prune -
再清理 未使用的卷:
docker volume prune(确认无重要数据) -
最后清理 镜像:
docker image prune -a -
定期执行
docker system prune或设置定时任务
重要提醒:执行清理前请确认:
-
没有需要保留的已停止容器
-
没有重要数据存储在要删除的卷中
-
生产环境建议先在测试环境验证