在Docker Desktop(Windows)中定位数据卷

282

我目前正在尝试学习Docker,但是我对数据卷实际存在的位置感到困惑。

我正在使用Windows版Docker桌面版。(Windows 10)

文档中说,在对象上运行docker inspect将为您提供源代码:https://docs.docker.com/engine/tutorials/dockervolumes/#locating-a-volume

$ docker inspect web

"Mounts": [
    {
        "Name": "fac362...80535",
        "Source": "/var/lib/docker/volumes/fac362...80535/_data",
        "Destination": "/webapp",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
]

然而我并没有看到这个,我看到的是以下内容:

$ docker inspect blog_postgres-data
[
    {
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/blog_postgres-data/_data",
        "Name": "blog_postgres-data",
        "Options": {},
        "Scope": "local"
    }
]

有人能帮帮我吗?我想知道我的数据卷实际上存在哪里,是在我的主机上吗?如果是的话,我该怎么获取它的路径呢?


你找到查看它们“实际”存储的解决方案了吗?在Docker工具箱中验证非常容易,我们可以登录docker-machine并进行检查。然而,在Docker桌面版中,我还没有找到一种验证这些卷存在的方法。 - Nag
2
请查看被接受的答案。 - Brad
19个回答

626

我正在使用 Windows + WSL 2 (Ubuntu 18.04)。

在 Windows 文件资源管理器中输入:

  • Docker 版本 20.10.+ :\\wsl$\docker-desktop-data\data\docker\volumes
  • Docker Engine v19.03: \\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\

每个卷都对应一个目录。


34
天啊,我简直不敢相信在找到你的答案和解决方案之前花了多长时间。我在很多地方都搜索过,感觉这是一个全新的问题。非常感谢。 - Sarel Botha
21
更一般地说,/var/lib/docker/ 映射到 \\wsl$\docker-desktop-data\version-pack-data\community\docker\ - David
3
非常令人困惑 - 我也是这样的。 - Pixelartist
6
这对我有用,但我也想知道官方文档中是否有明确记录。 - wlnirvana
2
为了使其正常工作,我必须先在我的Windows 10机器上启用网络检测,否则在文件资源管理器中输入wsl$路径后会收到错误消息。 - Bigman74066
显示剩余9条评论

85

您的卷目录是/var/lib/docker/volumes/blog_postgres-data/_data/var/lib/docker通常被挂载在C:\Users\Public\Documents\Hyper-V\Virtual hard disks中。无论如何,您可以通过查看Docker设置来检查它。

有关如何在Windows上与Docker共享驱动器的信息,请参阅这些文档

顺便说一下,在以下输出中,Source是主机上的位置,而Destination是容器内的位置:

"Mounts": [
{
    "Name": "fac362...80535",
    "Source": "/var/lib/docker/volumes/fac362...80535/_data",
    "Destination": "/webapp",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
}
]

更新以回答评论中的问题:

我的主要疑问是分享图像等很好,但我如何分享我的数据?

实际上,volume旨在管理Docker容器中的数据。卷中的数据将持久保存在主机文件系统上,并与Docker容器/镜像的生命周期隔离开来。您可以通过以下方式分享您的数据:

  • 挂载Docker卷到主机并重复使用它

    docker run -v /path/on/host:/path/inside/container image

    然后所有数据都将保留在 /path/on/host 中;您可以备份它,将其复制到另一台机器上,并使用相同的卷重新运行容器。

  • 创建和挂载数据容器。

    创建数据容器:docker create -v /dbdata --name dbstore training/postgres /bin/true

    基于此容器运行其他容器,使用--volumes-fromdocker run -d --volumes-from dbstore --name db1 training/postgres,然后由db1生成的所有数据将保留在容器dbstore 的卷中。

有关更多信息,请参见官方Docker卷文档

简单地说,volumes只是您主机上所有容器数据的目录,因此您可以使用以前使用的任何方法备份/共享数据。

我能像处理镜像那样将一个卷推送到docker-hub吗?

不行。 Docker 镜像是可以推送到Docker hub(也称为“注册表”)的内容;但数据则不行。您可以使用任何您喜欢的方法备份/保留/分享数据,但将数据推送到Docker注册表并共享它没有任何意义。

我可以备份等操作吗?

是的,如上所述 :-)


@Brad,你可以在多个容器中挂载同名的卷。因此,docker run -it --rm -v blog_postgres-data:/data busybox ls -l /data 将显示该数据。 - BMitch
9
目录"C:\Users\Public\Documents\Hyper-V\Virtual hard disks"为空(Windows 10企业版)。 - Leos Literak
2
目录“C:\Users\Public\Documents\Hyper-V\Virtual hard disks”对我来说也是空的。 - Gigino
1
你的Docker最终由Hyper-V管理(除非你使用WSL2)。它可能位于ProgramData\DockerDesktop下。 - hyamanieu
1
你可以在C:\ProgramData\Docker中找到它,但是"ProgramData"是一个隐藏的文件夹。子文件夹\volumes将包含通过"docker volume ls"找到的所有内容。 - ill
显示剩余3条评论

51

针对Windows 10 + WSL 2 (Ubuntu 20.04),Docker版本为20.10.2,构建版本为2291f61

Docker构件可以在以下位置找到

DOCKER_ARTIFACTS == \\wsl$\docker-desktop-data\version-pack-data\community\docker

数据卷可以在以下位置找到

这里输入图片描述

DOCKER_ARTIFACTS\volumes\[VOLUME_ID]\_data

这里输入图片描述


1
谢谢你。我一直在努力寻找正确的路径。你是从哪里找到正确的文件夹的?网络上大多数答案都已过时且不准确,指向现在已经不存在的文件夹。 - Leônidas Villeneuve
2
太棒了,非常感谢。对于任何仍然感到困惑的Windows用户,只需将此路径\wsl$\docker-desktop-data\version-pack-data\community\docker复制粘贴到您的文件浏览器中即可工作 :D。 - Tanzim Chowdhury
大家好,不要在文件路径的开头键入“Network”。只需键入\wsl$。这样,您可以手动导航到 Docker 文件,以便任何想更好地了解如何导航到这些文件的人。希望这有所帮助 :) 这是我找到的访问 wsl$ 的资源 https://www.ntweekly.com/2021/05/18/open-wsl-path-on-windows-explorer/。 - Monttana16
使用 Docker Desktop v20。docker volume inspect my_vol 显示一个有效的卷。\wsl$ 是空的。 - dudeNumber4

40

我发现我的 Docker 在 WSL 2(Ubuntu 20.04)中的设置会在 Windows 10 上使用此位置:

C:\Users\Username\AppData\Local\Docker\wsl\data\ext4.vhdx

其中Username是您的用户名。


1
使用 Docker Desktop v20。docker volume inspect my_vol 显示一个有效的卷。C:\Users\me\AppData\Local\Docker\wsl 不存在。 - dudeNumber4

37
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\

对我也起作用了(Windows 10 Home),太棒了。


仍适用于 Docker Desktop 3.5.0,Win 11 21H2(OS 构建版本 22000.120)。 - JohnC

21

在Windows主机上运行基于Linux的容器时,实际卷将存储在Linux虚拟机中,并且不会在主机的文件系统上可用,否则在Windows上运行Windows => C:\ProgramData\Docker\volumes\

此外,docker inspect <container_id>将列出容器配置,在挂载部分下查看有关持久性层的更多详细信息。

更新: 不适用于在WSL上运行的Docker。


2
你的答案是正确的:“在Windows主机上运行基于Linux的容器时,实际卷将存储在Linux虚拟机中,并且不会在主机的文件系统上可用。”我在“C:\Users\Public\Documents\Hyper-V\Virtual hard disks”文件夹中找不到任何项目。 - theeranitp
似乎Docker桌面版非常愿意轻易地摧毁那个虚拟机。例如,我尝试在Docker桌面版>设置>Docker引擎的JSON文件中更改了一些内容,但它显然是无效的。在Docker桌面版尝试重新启动几次后,我恰好在Hyper-V管理器中观察到它只是删除了该虚拟机。 - Aaron Axvig
@AaronAxvig 等等,你的所有数据都这样丢失了吗?这怎么能够接受呢?所以他们没有给我们备份的能力(因为卷显然无处可寻),而且它就这样消失了?如果你可以像这样失去所有数据,那 Docker 的意义是什么? - gargoylebident

14

如果你启用了wsl2,可以在文件资源管理器中找到它,路径为\\wsl$\docker-desktop\mnt\host\wsl\docker-desktop-data\data\docker


9

对于Docker桌面版(Windows),您可以在下面的路径中找到与主机关联的卷:

\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes

8
如果你觉得输入或记忆 \\wsl$ 很麻烦,那么在 Windows 10 release 2004 及更新版本中有一种更加 GUI 友好的方法。使用 WSL 2,你可以通过文件资源管理器中的新 Linux 图标安全地访问所有特殊的 WSL 共享。

Linux icon shown as the last scrollable item in the folders pane within File Explorer

从那里,您可以深入了解(例如)\docker-desktop-data\data\docker\volumes,正如其他答案中所提到的。

\wsl.localhost\docker-desktop-data\data\docker\volumes within File Explorer

更多详细信息,请参考Microsoft官方WSL文件系统文档,其中提到了这些访问方法。对于技术上有好奇心的人,Microsoft深入探讨视频应该能回答很多问题。


7
在我的情况下,我在WSL2上安装了Docker Desktop,并且我发现我的镜像文件在:
\\wsl$\docker-desktop-data\version-pack-data\community\docker\overlay2
\\wsl$\docker-desktop-data\version-pack-data\community\docker

容器、镜像和卷的信息都在那里。

所有镜像文件都存储在那里,并已分成几个带有长字符串名称的文件夹。当我查看每个文件夹时,我可以在“diff”文件夹中找到所有真正的镜像文件。

虽然终端显示路径为“var/lib/docker”,但该文件夹并不存在,实际文件也未存储在其中。我认为这没有错误,“var/lib/docker”只是链接或映射到真正的文件夹,就像那样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接