我正在学习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"
    }
]

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


当前回答

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

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

其他回答

如果你在windows上使用Docker For windows,那么Docker通过VM (MobyLinuxVM)工作。您的卷(如everting else)在此VM中!而是如何找到他们:

# get a privileged container with access to Docker daemon
docker run --privileged -it --rm -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker alpine sh

# in second power-shell run a container with full root access to MobyLinuxVM
docker run --net=host --ipc=host --uts=host --pid=host -it --security-opt=seccomp=unconfined --privileged --rm -v /:/host alpine /bin/sh

# switch to host FS
chroot /host

# and then go to the volume you asked for
cd /var/lib/docker/volumes/YOUR_VOLUME_NAME/_data

对我来说,我找到了我的书

\\wsl$\docker-desktop-data\data\docker\volumes\

使用WSL2和Windows 21H1

对于Windows 10 + WSL 2 (Ubuntu 20.04), Docker版本20.10.2,build 2291f61

Docker工件可以在

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

数据卷可以在

\ [VOLUME_ID] \ _data DOCKER_ARTIFACTS \卷

在我的例子中,我在wsl2上安装了docker-desktop, windows 10 home。我找到了我的图像文件

\\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”只是链接或映射到真正的文件夹,就像这样

每个容器都有独立于主机文件系统的自己的文件系统。如果你使用-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在主机和容器之间复制文件。