docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > docker镜像删除后所占空间仍然占用

docker镜像删除后所占空间仍然占用的具体原因和解决办法

作者:commander90

在Docker中,有时会因为各种原因导致磁盘空间占用过多,下面这篇文章主要介绍了docker镜像删除后所占空间仍然占用的具体原因和解决办法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

这是 Docker 基于 虚拟文件系统(VFS)和虚拟硬盘(VHDX) 的核心特性导致的,本质是「删除操作只清理 Docker 内部逻辑空间,不自动回收物理磁盘空间」,具体原因和解决办法如下:

一、为什么删除镜像后,空间还被占用?

核心是「两层空间分离」,删除镜像只动「上层逻辑空间」,不动「下层物理空间」:

1. 第一层:Docker 内部的「逻辑空间」(镜像 / 容器实际存储)

Docker 用「分层存储」管理镜像:

2. 第二层:宿主的「物理空间」(虚拟硬盘 VHDX 占用)

Windows 上 Docker 依赖 WSL2/Hyper-V,所有 Docker 数据(镜像、容器、缓存)都会存在一个「虚拟硬盘文件」里(比如 ext4.vhdx 或 docker_data.vhdx):

简单说:删除镜像只是「清空了虚拟硬盘里的文件」,但虚拟硬盘这个 “气球皮” 还保持着原来的大小,所以物理磁盘空间没释放。

二、彻底释放空间的 3 步核心操作(从易到难)

第一步:先清理 Docker 内部的「冗余逻辑数据」(确保真的删干净)

删除镜像后,可能还残留「悬空镜像(<none> 标签)、未使用的数据卷、构建缓存」,这些会继续占用虚拟硬盘的逻辑空间,先彻底清理:

  1. 以管理员身份打开 PowerShell,执行「深度清理命令」:

    # 清理所有未使用的资源(镜像、容器、网络、数据卷、缓存)
    docker system prune -a --volumes --force

第二步:压缩虚拟硬盘,回收物理空间(关键步骤)

清理完 Docker 内部后,虚拟硬盘的「逻辑空间」空了,但「物理空间」还被占用,需要手动压缩虚拟硬盘:

情况 A:Win10/11 专业版 / 企业版(支持 Hyper-V)

  1. 关闭 Docker 和 WSL:
    # 完全关闭 Docker(确保退出)
    wsl --shutdown
  2. 执行压缩命令:
    # 压缩 Docker 虚拟硬盘(默认路径,THINKPAD 替换为你的用户名)
    optimize-vhd -Path "C:\Users\THINKPAD\AppData\Local\Docker\wsl\data\ext4.vhdx" -Mode full

情况 B:Win10/11 家庭版(不支持 Hyper-V,用 diskpart 压缩)

  1. 关闭 Docker 和 WSL:
    wsl --shutdown
  2. 用 diskpart 工具压缩(复制粘贴执行,注意路径正确):
    diskpart
    # 选择 Docker 虚拟硬盘(路径替换为你的实际路径,默认如下)
    select vdisk file="C:\Users\THINKPAD\AppData\Local\Docker\wsl\data\ext4.vhdx"
    # 只读模式附加硬盘(避免占用)
    attach vdisk readonly
    # 压缩硬盘(核心步骤)
    compact vdisk
    # 分离硬盘
    detach vdisk
    # 退出工具
    exit

验证压缩结果:

打开「文件资源管理器」,导航到 C:\Users\THINKPAD\AppData\Local\Docker\wsl\data\,查看 ext4.vhdx 的大小,会明显变小(比如从 18GB 降到 5GB 左右)。

第三步:预防后续空间膨胀(可选,长期有效)

  1. 定期清理:每隔 1-2 周执行一次 docker system prune -a --volumes
  2. 限制虚拟硬盘大小:Docker Desktop 中设置「资源→高级→磁盘大小限制」(比如设为 20GB),避免无限制扩容;
  3. 迁移虚拟硬盘到其他盘符(C 盘紧张时):
    • 关闭 Docker,复制 ext4.vhdx 到 D 盘(比如 D:\Docker\data\);
    • 在 Docker Desktop 中「设置→资源→WSL 集成→高级」,指定新的虚拟硬盘路径,重启 Docker。

总结

删除镜像后空间不释放,核心是「虚拟硬盘不会自动收缩」,解决逻辑是:

  1. 清理 Docker 内部冗余(确保逻辑空间空了);
  2. 压缩虚拟硬盘(回收物理空间);
  3. 定期维护(避免再次膨胀)。

到此这篇关于docker镜像删除后所占空间仍然占用的具体原因和解决办法的文章就介绍到这了,更多相关docker镜像删除后所占空间仍然占用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文