Docker 存储清理:merging 层问题处理

当 Docker 存储驱动使用 overlayoverlay2 时,可能会出现 "merging" 层占用大量磁盘空间的情况。以下是清理 Docker merge 层的几种方法:

1. 识别合并层和占用空间情况

首先确认磁盘占用情况:

docker system df
# 或更详细的版本
docker system df -v

查看 Docker 存储驱动使用情况:

docker info | grep "Storage Driver"

2. 清理无用 Docker 对象

基本清理命令

# 删除所有停止的容器
docker container prune

# 删除所有未被使用的网络
docker network prune

# 删除所有悬挂镜像 (dangling images)
docker image prune

# 删除所有未被使用的卷
docker volume prune

# 一键执行上述所有清理 (交互式确认)
docker system prune

# 强制清理所有未被使用的对象 (无需确认)
docker system prune -a -f

针对性清理

# 删除特定日期的容器
docker container ls -a --filter "until=24h" | awk '{print $1}' | xargs docker rm

# 删除未被任何容器引用的镜像
docker image ls -qf dangling=true | xargs docker rmi

3. 手动清理 overlay2 存储目录(慎用)

找出 Docker 存储位置:

docker info | grep "Docker Root Dir"

通常是 /var/lib/docker/overlay2

清理步骤:

# 首先停止 Docker 服务
sudo systemctl stop docker

# 备份重要数据后,清理 overlay2 目录
sudo rm -rf /var/lib/docker/overlay2/*

# 重新启动 Docker
sudo systemctl start docker

⚠️ 注意:这会删除所有 Docker 数据!仅在所有容器和镜像都可重建时使用。

4. 清理容器日志文件

# 查看日志文件大小
sudo du -ha /var/lib/docker/containers/ | grep ".*-json.log" | sort -h

# 清空日志文件(不影响正在运行的容器)
sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log

# 或设置日志轮转
sudo nano /etc/docker/daemon.json

添加以下配置:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

然后重启 Docker:

sudo systemctl restart docker

5. 预防性措施

设置存储驱动参数

/etc/docker/daemon.json 中添加:

{
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true",
    "overlay2.size=50G"
  ]
}

定期清理脚本示例

#!/bin/bash
# 自动清理 Docker 资源的脚本

echo "=== 开始 Docker 系统清理 ==="
date

echo "1. 清理停止的容器..."
docker container prune -f

echo "2. 清理悬挂镜像..."
docker image prune -f

echo "3. 清理 Builder 缓存..."
docker builder prune -f

echo "4. 清理日志文件..."
find /var/lib/docker/containers/ -name "*-json.log" -type f -delete

echo "=== 清理完成 ==="
df -h /

保存为 docker-cleanup.sh 并设置为定期执行。

注意事项

  1. 生产环境中执行清理前,确保备份重要容器和数据
  2. docker system prune -a 会删除所有未被使用的镜像,包括可能被其他项目依赖的基础镜像
  3. 清理操作可能需要停止相关容器服务
  4. 如果问题频繁出现,考虑调整 Docker 存储驱动或迁移数据目录到更大分区

通过这些方法,可以有效地清理 Docker 的 merging 层和相关存储空间占用问题。

最后修改:2025 年 12 月 11 日
如果觉得我的文章对你有用,请随意赞赏