我正在学习docker,我对数据卷实际存在的地方感到困惑。

我正在使用Windows的Docker Desktop。(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"
    }
]

有人能帮帮我吗?我只想知道我的数据量在哪里是在主机上吗?如果是这样,我怎么能得到它的路径?


当前回答

每个容器都有独立于主机文件系统的自己的文件系统。如果你使用-v标志运行容器,你可以挂载卷,这样主机和容器就可以看到相同的数据(就像docker run -v hostFolder:containerFolder)。

您打印的第一个输出描述了这样一个挂载卷(因此是挂载),其中/var/lib/docker/volumes/ fac362…80535/_data(主机)挂载到/webapp(容器)。

我假设您没有使用-v,因此该文件夹没有被挂载,只能在容器文件系统中访问,您可以在/var/lib/docker/volumes/blog_postgres-data/_data中找到。如果删除容器(docker -rm),这些数据将被删除,因此挂载文件夹可能是个好主意。

至于在哪里可以从窗口访问这些数据的问题。据我所知,windows的docker使用了windows 10中的bash子系统。我会尝试在windows10上运行bash,然后找到那个文件夹,或者找出如何从windows10上访问linux文件夹。在windows 10中查看有关linux子系统的常见问题解答。

更新:你也可以使用docker cp在主机和容器之间复制文件。

其他回答

如果你正在搜索数据的实际位置,当你把一个卷指向docker“vm”,如下所示:

version: '3.0'
services:
  mysql-server:
    image: mysql:latest
    container_name: mysql-server
    restart: always
    ports:
      - 3306:3306
    volumes:
      - /opt/docker/mysql/data:/var/lib/mysql

“/opt/docker/mysql/data”或者仅仅是“/”位于\\wsl$\docker-desktop\mnt\version-pack\containers\services\docker\rootfs

希望这对你有所帮助:)

您可以在Docker Desktop(Windows)下面的路径中找到与主机关联的卷。

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

如果你觉得输入\\wsl$或记住它很痛苦,在Windows 10发行版2004及以后版本中有一个更友好的gui方法。使用WSL 2,您可以通过文件资源管理器中的新Linux图标安全地导航到所有特殊的WSL共享:

从那里你可以钻到(例如)\docker-desktop-data\data\docker\volumes,就像在其他答案中提到的那样。

有关更多细节,请参考Microsoft的官方WSL文件系统文档,其中提到了这些访问方法。对于技术好奇的人来说,微软的深度潜水视频应该能回答很多问题。

当在windows主机上运行基于linux的容器时,实际的卷将存储在linux VM中,而在主机的fs中是不可用的,否则运行在windows上的windows => C:\ProgramData\Docker\volumes\

docker inspect <container_id>将列出容器配置,在Mounts部分可以看到更多关于持久化层的细节。

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

每个容器都有独立于主机文件系统的自己的文件系统。如果你使用-v标志运行容器,你可以挂载卷,这样主机和容器就可以看到相同的数据(就像docker run -v hostFolder:containerFolder)。

您打印的第一个输出描述了这样一个挂载卷(因此是挂载),其中/var/lib/docker/volumes/ fac362…80535/_data(主机)挂载到/webapp(容器)。

我假设您没有使用-v,因此该文件夹没有被挂载,只能在容器文件系统中访问,您可以在/var/lib/docker/volumes/blog_postgres-data/_data中找到。如果删除容器(docker -rm),这些数据将被删除,因此挂载文件夹可能是个好主意。

至于在哪里可以从窗口访问这些数据的问题。据我所知,windows的docker使用了windows 10中的bash子系统。我会尝试在windows10上运行bash,然后找到那个文件夹,或者找出如何从windows10上访问linux文件夹。在windows 10中查看有关linux子系统的常见问题解答。

更新:你也可以使用docker cp在主机和容器之间复制文件。