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

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

前言

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

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

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

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

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

  • 一个镜像由多个只读「层(Layer)」组成,删除镜像时,只会标记该镜像对应的「层」为「未被引用」;
  • 但如果其他镜像共享了这些「层」(比如多个镜像基于同一个基础镜像,如 ubuntu),这些层不会被真正删除,空间自然不会释放;
  • 即使是独有的层,删除后也只是「逻辑上不可用」,不会立刻回收物理空间。

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

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

  • 这个虚拟硬盘的特性是「只增不减」:当你往 Docker 里存数据(拉镜像、跑容器),它会扩容占用物理空间;
  • 但当你删除 Docker 里的内容(删镜像、删容器),虚拟硬盘不会自动「收缩」—— 它会保留曾经达到的最大容量,相当于 “气球吹大后,放气了但气球皮不会缩小”。

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

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

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

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

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

    # 清理所有未使用的资源(镜像、容器、网络、数据卷、缓存)
    docker system prune -a --volumes --force
  • -a:删除所有无容器关联的镜像(包括悬空镜像);
  • --volumes:删除未使用的数据卷(避免数据卷占用空间);
  • --force:跳过确认,直接清理。
  • 验证清理结果:

    # 查看当前镜像(应该只剩你需要的)
    docker images
    # 查看数据卷(应该为空)
    docker volume ls

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

清理完 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镜像删除后所占空间仍然占用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 查看和更改Docker容器IP地址的操作指南

    查看和更改Docker容器IP地址的操作指南

    Docker 提供了灵活的网络配置能力,允许用户查看和更改容器的 IP 地址,这在构建微服务架构、进行网络调试、或需要对网络流量进行精细控制时尤为重要,本文将详细介绍如何查看和更改 Docker 容器的 IP 地址,需要的朋友可以参考下
    2025-09-09
  • docker中容器运行时如何将目录和宿主机进行挂载

    docker中容器运行时如何将目录和宿主机进行挂载

    对于一个已经运行的容器,如果后续需要新挂载一个目录怎么办?下面这篇文章主要给大家介绍了关于docker中容器运行时如何将目录和宿主机进行挂载的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • 利用Docker 运行 python 简单程序

    利用Docker 运行 python 简单程序

    这篇文章主要介绍了利用Docker 运行 python 简单程序,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • Docker 教程之数据管理详细介绍

    Docker 教程之数据管理详细介绍

    这篇文章主要介绍了Docker 教程之数据管理详细介绍的相关资料,需要的朋友可以参考下
    2017-01-01
  • docker和docker compose离线安装完整步骤

    docker和docker compose离线安装完整步骤

    Docker是一种用于容器化应用程序的开源平台,它使得应用程序能够在容器中独立运行,提供了更高的可移植性和便携性,这篇文章主要介绍了docker和docker compose离线安装的相关资料,需要的朋友可以参考下
    2025-10-10
  • Docker开启TLS和CA认证的方法步骤

    Docker开启TLS和CA认证的方法步骤

    本文主要介绍了Docker开启TLS和CA认证的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Docker实践之python应用容器化

    Docker实践之python应用容器化

    这篇文章主要介绍了Docker实践之python应用容器化,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • 通过Docker创建CentOS容器的实现步骤

    通过Docker创建CentOS容器的实现步骤

    本文主要介绍了Docker创建CentOS容器,使用文内的脚本可以快速创建CentOS 7.8虚拟系统集群,并通过SSH(Secure Shell)远程工具连接,感兴趣的可以了解一下
    2021-11-11
  • Rocky Linux 9.2下使用dnf安装Docker全流程指南

    Rocky Linux 9.2下使用dnf安装Docker全流程指南

    Docker 是当前最流行的容器化平台,本文以 Rocky Linux 9.2 为例,详细介绍如何使用 dnf 命令安装 Docker,完成配置并进行基础使用,希望对大家有所帮助
    2025-08-08
  • 如何进入、退出docker的container实现

    如何进入、退出docker的container实现

    这篇文章主要介绍了如何进入、退出docker的container实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论