在使用 Docker 部署服务的过程中,最常见的问题之一就是 数据根目录空间不足 。当宿主机的 /var/lib/docker 目录占用过多空间时,不仅会导致镜像无法拉取、容器无法启动,还可能造成服务异常。下面我们从成因、排查到解决一步一步说明。
一、Docker 数据根目录是什么
Docker 默认将所有运行所需的数据存放在 /var/lib/docker 目录,包括:
-
镜像(images)
-
容器文件系统(containers)
-
本地卷数据(volumes)
-
网络、日志、metadata 等
因此,随着镜像增多、容器频繁运行、日志不断积累,这个目录可能会迅速膨胀。
二、为什么会空间不足
2.1 镜像过多、未清理
很多测试镜像、旧版本镜像长期堆积,占用大量空间。
2.2 已退出的容器仍占空间
即使容器不在运行,它的文件系统仍然存在。
2.3 Volume 持久化数据不断增大
特别是数据库、日志持久盘,不清理会迅速爆满。
2.4 Docker 日志过大
容器内程序不断输出日志,Docker 会将其记录到:
/var/lib/docker/containers/<id>/<id>-json.log
日志文件几十 GB 也很常见。
2.5 构建镜像造成大量临时层
频繁执行 docker build 会产生 build cache,占用大量空间。
这里我遇到的问题是:所提供的服务器/home目录空间过小,无法拉起镜像。
三、如何排查 Docker 占用空间
3.1 查看 Docker 磁盘用量
docker system df

3.2 查看容器日志大小
du -sh /var/lib/docker/containers/*/*-json.log

3.3 查看各类型数据占用比例
sudo du -h --max-depth=1 /var/lib/docker

四、解决方案:释放Docker空间
4.1 清理无用镜像
docker image prune -a
4.2 清理已停止容器
docker container prune
4.3 清理无主 volume
docker volume prune
4.4 清理容器日志
手动清理
truncate -s 0 /var/lib/docker/containers/*/*-json.log
设置日志大小限制(推荐)
编辑 /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
重启 Docker:
systemctl restart docker
我说实话没啥用啊。我这里是因为条件不行,所以我选择以下解决方案。
五、从根本解决:迁移 Docker 数据目录
5.1 在要转移的目录/home下新建目录
cd /home
mkdir data_catalog
5.2 停止docker服务
sudo systemctl stop docker
5.3 移动 Docker 数据目录
sudo mv /var/lib/docker /home/data_catalog
5.4 创建符号链接
sudo ln -s /home/data_catalog/docker /var/lib
5.5 重启docker服务
sudo systemctl start docker