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

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


当前回答

我是Windows + WSL 2 (Ubuntu 18.04)。

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

适用于Docker 20.10版。+: \\wsl$\docker-desktop-data\data\docker\volumes 对于Docker引擎v19.03: \\wsl$\ Docker -desktop-data\version-pack-data\community\ Docker \volumes\

每个卷有一个目录。

其他回答

在我的例子中,我在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在主机和容器之间复制文件。

在启用了WSL2的Windows 11 Docker Desktop v4.15.0中,导航到volumes文件夹的路径是\\wsl.localhost\ Docker - Desktop -data\data\ Docker \volumes

卷目录为/var/lib/docker/volumes/blog_postgres-data/_data, /var/lib/docker通常挂载在C:\Users\Public\Documents\Hyper-V\Virtual硬盘。不管怎样,你可以在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": ""
}
]

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

我在这里主要的好奇心是,共享图像等是伟大的,但我如何共享我的数据?

实际上卷就是为这个目的设计的(在Docker容器中管理数据)。卷中的数据持久化在主机FS上,并与Docker容器/映像的生命周期隔离。您可以通过以下方式共享卷中的数据:

Mount Docker volume to host and reuse it docker run -v /path/on/host:/path/inside/container image Then all your data will persist in /path/on/host; you could back it up, copy it to another machine, and re-run your container with the same volume. Create and mount a data container. Create a data container: docker create -v /dbdata --name dbstore training/postgres /bin/true Run other containers based on this container using --volumes-from: docker run -d --volumes-from dbstore --name db1 training/postgres, then all data generated by db1 will persist in the volume of container dbstore.

要了解更多信息,您可以参考Docker volumes官方文档。

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

我可以像处理图像一样将卷推送到docker-hub吗?

不。Docker映像是你可以推送到Docker中心(也就是Docker hub)的东西。“注册表”);但数据并非如此。你可以用任何你喜欢的方法备份/持久化/共享你的数据,但是将数据推送到Docker注册表来共享它没有任何意义。

我可以做备份吗?

是的,如上所述:-)

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

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