Docker Root Dir 是 Docker 守护进程配置的根目录,不等同于容器数据实际落盘位置;在 Windows Docker Desktop(WSL2 模式)下,真实数据存储于 docker-desktop-data 发行版的 ext4.vhdx 虚拟磁盘内,需通过 wsl --list -v 和 \\wsl.localhost\docker-desktop-data\ 定位物理路径。

docker info 显示的 Docker Root Dir 不是容器数据落盘位置
很多人看到 docker info | findstr "Docker Root Dir" 输出 D:docker-data 就以为所有容器文件都写在那里,其实不是。这个路径只是 Docker daemon 的配置根目录,真正存放镜像层、容器可写层、卷数据的位置,取决于你用的是 WSL2 还是 Linux 后端,以及是否改过 data-root 或迁移过 WSL 实例。
在 Windows 上使用 Docker Desktop(默认 WSL2 模式)时,Docker Root Dir 通常指向 WSL2 虚拟磁盘内部路径(如 /var/lib/docker),而该路径实际映射到宿主机上的 ext4.vhdx 文件——它藏在 C:UsersXXXAppDataLocalDockerwsldata 或你迁移后的新路径里。
- 如果你用 GUI 或
daemon.json改过data-root,但没迁移 WSL 实例,那改动无效:WSL2 模式下 Docker Desktop 忽略daemon.json中的data-root - 如果你执行过 WSL 实例迁移(比如把
docker-desktop-data导出到D:dockerdata),那真实数据就在那个新路径下的ext4.vhdx文件里 -
docker info显示的路径,是 WSL2 系统内看到的路径,不是 Windows 文件系统里的物理路径
查容器实际写入位置:先看挂载类型,再定位宿主机路径
容器内某个路径(比如 /var/lib/mysql)有没有真正落盘到宿主机,不看 pwd,也不看镜像 VOLUME 声明,而是看运行时是否被显式挂载。关键命令是:
docker inspect --format='{{range .Mounts}}{{.Type}}: {{.Source}} -> {{.Destination}} ({{.Mode}}){{println}}{{end}}'
输出中重点关注 Type 字段:
-
bind类型:.Source是宿主机绝对路径(如/d/mysql/data),这就是真实落盘位置,直接ls /d/mysql/data就能验证 -
volume类型:.Source是卷名(如mysql_data),需再执行docker volume inspect mysql_data查Mountpoint字段,才是宿主机路径(通常为/var/lib/docker/volumes/mysql_data/_data,但在 WSL2 下,这个路径仍属于虚拟磁盘内部) -
tmpfs类型:纯内存,重启即丢,不落盘
注意:如果没做任何 -v 或 --mount,即使镜像声明了 VOLUME ["/data"],Docker 也会自动创建匿名卷,其 Mountpoint 仍归属 /var/lib/docker 下,也就是最终落在 WSL2 的 ext4.vhdx 里。
Windows 下确认 WSL2 虚拟磁盘物理位置
这才是决定“容器数据到底占了我哪块硬盘空间”的终极答案。别只盯着 docker info,要定位到 .vhdx 文件本身:
- 打开 PowerShell(无需管理员权限),运行:
wsl --list -v,确认docker-desktop-data状态为Stopped - 执行:
wsl -d docker-desktop-data -e ls /mnt/—— 这会临时进入该实例,查看其挂载结构(通常显示/mnt/wsl或类似) - 更直接的方式:在资源管理器中访问
\wsl.localhostdocker-desktop-data,然后导航到/var/lib/docker,就能看到镜像、容器、卷的实际目录树 - 若已迁移 WSL 实例,物理
.vhdx文件就在你导入时指定的目标目录下(如D:dockerdataext4.vhdx),右键属性看大小即知占用
这个 .vhdx 文件就是容器所有未显式绑定到宿主机的读写数据的最终归宿——包括匿名卷、容器可写层、镜像层缓存。它不会随你改 daemon.json 自动挪动,必须通过 WSL 导出/导入流程迁移。
为什么进容器 ls -l /var/lib/docker 看不到东西
因为你在容器里执行 ls,看到的是容器自己的命名空间和 rootfs,它不包含宿主机的 /var/lib/docker。那个路径在容器内根本不可见,除非你用 bind 挂载进去(不推荐)。真正有效的检查方式只有两种:
- 从宿主机出发:查
docker inspect的Mounts+docker volume inspect+ 直接访问\wsl.localhost... - 从 WSL2 实例出发:用
wsl -d docker-desktop-data登录后,在里面查/var/lib/docker
最容易忽略的一点是:Docker Desktop 的 WSL2 模式下,docker-desktop 和 docker-desktop-data 是两个分离的发行版,前者是控制平面,后者才存数据。查错对象(比如去 docker-desktop 里找 /var/lib/docker)会导致完全找不到路径。











