我正在学习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在主机和容器之间复制文件。


卷目录为/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注册表来共享它没有任何意义。

我可以做备份吗?

是的,如上所述:-)


挂载任何基于NTFS的目录都不能达到我的目的(MongoDB -据我所知,至少Redis和CouchDB也是如此):NTFS权限不允许对容器中运行的此类db进行必要的访问。下面是HyperV上命名卷的设置。

下面的方法在服务中启动ssh服务器,使用docker-compse进行设置,以便自动启动并在主机和容器之间使用公钥加密进行授权。这样可以通过scp或sftp上传/下载数据。

完整的船坞式结构。下面是一个webapp + mongodb的Yml,以及一些关于如何使用SSH服务的文档:

version: '3'
services:
  foo:
    build: .
    image: localhost.localdomain/${repository_name}:${tag}
    container_name: ${container_name}
    ports:
      - "3333:3333"
    links:
      - mongodb-foo
    depends_on:
      - mongodb-foo
      - sshd
    volumes:
      - "${host_log_directory}:/var/log/app"

  mongodb-foo:
    container_name: mongodb-${repository_name}
    image: "mongo:3.4-jessie"
    volumes:
      - mongodata-foo:/data/db
    expose:
      - '27017'

  #since mongo data on Windows only works within HyperV virtual disk (as of 2019-4-3), the following allows upload/download of mongo data
  #setup: you need to copy your ~/.ssh/id_rsa.pub into $DOCKER_DATA_DIR/.ssh/id_rsa.pub, then run this service again
  #download (all mongo data): scp -r -P 2222 user@localhost:/data/mongodb [target-dir within /c/]
  #upload (all mongo data): scp -r -P 2222 [source-dir within /c/] user@localhost:/data/mongodb
  sshd:
    image: maltyxx/sshd
    volumes:
        - mongodata-foo:/data/mongodb
        - $DOCKER_DATA_DIR/.ssh/id_rsa.pub:/home/user/.ssh/keys/id_rsa.pub:ro
    ports:
        - "2222:22"
    command: user::1001

#please note: using a named volume like this for mongo is necessary on Windows rather than mounting an NTFS directory.
#mongodb (and probably most other databases) are not compatible with windows native data directories due ot permissions issues.
#this means that there is no direct access to this data, it needs to be dumped elsewhere if you want to reimport something.
#it will however be persisted as long as you don't delete the HyperV virtual drive that docker host is using.
#on Linux and Docker for Mac it is not an issue, named volumes are directly accessible from host.
volumes:
  mongodata-foo:

这是不相关的,但对于一个完全工作的例子,在任何docker-compose调用之前,需要运行以下脚本:

#!/usr/bin/env bash
set -o errexit
set -o pipefail
set -o nounset

working_directory="$(pwd)"
host_repo_dir="${working_directory}"
repository_name="$(basename ${working_directory})"
branch_name="$(git rev-parse --abbrev-ref HEAD)"
container_name="${repository_name}-${branch_name}"
host_log_directory="${DOCKER_DATA_DIR}/log/${repository_name}"
tag="${branch_name}"

export host_repo_dir
export repository_name
export container_name
export tag
export host_log_directory

更新:请注意,现在你也可以只使用docker cp,所以上面概述的sshd容器可能不再需要了,除非你需要远程访问运行在Windows主机下的容器中的文件系统。


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

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

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


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


我发现我的WSL 2 Docker安装(Ubuntu 20.04)在Windows 10中使用这个位置:

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

Username是你的用户名。


我是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\

每个卷有一个目录。


如果你在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

如果你正在搜索数据的实际位置,当你把一个卷指向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

希望这对你有所帮助:)


对于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 \卷


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

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

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

对我也有用(Windows 10家庭版),很棒的东西。


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


如果你使用windows,你的docker文件(在这种情况下你的卷)存在于docker用于windows Hyper-V或WSL的虚拟机上。但是,如果您需要访问这些文件,您可以复制容器文件并将它们存储在您的机器上,并以这种方式访问数据。

docker cp container_Id_Here:/var/lib/mysql path_To_Your_Local_Machine_Here

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

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

使用WSL2和Windows 21H1


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

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

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


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