在Docker Desktop(Windows)中查找数据卷


78

目前,我正在尝试学习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工具箱中进行验证非常容易,我们可以登录docker-machine并进行检查。但是,对于Docker Desktop,我还没有找到一种方法来验证这些卷的位置
Nag

查看已接受的答案
布拉德·

Answers:


60

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

您可以参考这些文档以获取有关如何在Windows上与Docker共享驱动器的信息。

BTWSource是主机Destination上的位置,也是以下输出中容器内部的位置:

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

=================================================== ========================

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

我的主要好奇是共享图像等很棒,但是如何共享数据?

实际上volume是为此目的而设计的(在Docker容器中管理数据)。卷中的数据保留在主机FS上,并与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-from:基于此容器运行其他容器docker run -d --volumes-from dbstore --name db1 training/postgres,然后生成的所有数据db1将保留在容器中dbstore

有关更多信息,您可以参考官方Docker卷文档

简而言之,volumes它只是主机上包含所有容器数据的目录,因此您可以使用以前使用的任何方法来备份/共享数据。

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

否。可以将Docker映像推送到Docker集线器(又名“注册表”)。但是数据不是。您可以使用任何您喜欢的方法来备份/持久/共享数据,但是将数据推送到Docker注册表以共享它没有任何意义。

我可以进行备份等吗?

是的,如上所述:-)


好的,因此来源/var/lib/docker/volumes/blog_postgres-data/_data是运行于其上的linux VM docker。我的主要好奇是共享图像等很棒,但是如何共享数据?我可以像处理图像一样将卷推送到docker-hub吗?我可以进行备份等吗?
布拉德(Brad)

@Brad,由于您的评论不够,我更新了您的问题的答案,希望对您有所帮助:-)
shizhz 17-4-4

@Brad,您可以在多个容器中挂载相同名称的卷。因此docker run -it --rm -v blog_postgres-data:/data busybox ls -l /data将显示该数据。
BMitch

3
目录“ C:\ Users \ Public \ Documents \ Hyper-V \ Virtual硬盘”为空(Wondows 10 Enterprise)
Leos Literak

但是dbstore已退出。如何查看/下载数据?
sushil

16

我在Windows + WSL 2(Ubuntu 18.04)上,我在此位置找到了Docker卷,请在Windows文件资源管理器中输入:

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

每卷将有一个目录。


2
谢谢,我一直在寻找答案将近两个小时:))保存了我的一天。
易卜拉欣Sakacı

2
神圣的母亲,我不敢相信我找到您的答案和解决方案花了多长时间。我看了很多荒谬的地方。我想这是一个崭新的事物。非常感谢。
萨雷尔·博塔

1
谢谢!即使两年后,这仍然是一个救命稻草。我我在2020年写:-)这个评论
DJJΝιΓΞΗΛψΚ

13

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

docker inspect <container_id>将列出容器配置,下支架部分看到关于持久层的更多细节。

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


1
您的回答是正确的“在Windows主机上运行基于linux的容器时,实际卷将存储在linux VM中,而主机的fs中将不可用”我在“ C:\ Users \ Public \中找不到任何项目“ Documents \ Hyper-V \ Virtual hard disks”文件夹。
theeranitp

看来Docker Desktop非常愿意简单地销毁该VM。例如,我尝试在Docker桌面>设置> Docker Engine中更改JSON文件中的内容,这显然无效。Docker Desktop尝试重新启动几次后,我碰巧在Hyper-V Manager中进行监视,它只是删除了VM。
亚伦·阿克斯维格

4

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


2

挂载任何基于NTFS的目录都无法达到我的目的(MongoDB-就我所知,至少Redis和CouchDB也是这种情况):NTFS权限不允许对运行在容器中的此类DB进行必要的访问。以下是在HyperV上使用命名卷进行的设置。

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

以下是Webapp + mongodb的完整docker-compose.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,因此,除非您需要远程访问Windows主机下的容器中运行的文件系统,否则上面概述的sshd容器可能不再需要。


1

每个容器都有自己的文件系统,该文件系统独立于主机文件系统。如果使用-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访问此数据的问题。据我所知,用于Windows的docker在Windows 10中使用bash子系统。我会尝试为Windows10运行bash并转到该文件夹​​,或者找出如何从Windows 10中访问linux文件夹。检查此上一个常见问题解答Windows 10中的Linux子系统

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


3
我意识到这已经有两年历史了,但是值得指出的是,用于Windows的Docker目前还没有使用用于Linux的Windows子系统;它是基于Windows的。而是在HyperV内运行Moby Linux。
alastair

1

我发现我的带有WSL 2(Ubuntu 20.04)的Docker设置使用以下位置:

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

UserName您的用户名在哪里。


0

如果您在Windows上并且使用Docker For Windows,则Docker可通过VM(MobyLinuxVM)工作。您的卷(和其他版本一样)都在此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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.