在Docker Desktop中定位数据卷(Windows)

问题描述 投票:26回答:3

我正在尝试学习docker,我对数据量实际存在的位置感到困惑。

我正在使用Docker Desktop for Windows。 (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-for-windows docker-desktop
3个回答
26
投票

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

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

BTW,Source是主机上的位置,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-fromdocker run -d --volumes-from dbstore --name db1 training/postgres运行基于此容器的其他容器,然后db1生成的所有数据将保留在容器dbstore的容量中。

有关更多信息,请参阅official Docker volumes docs

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

我可以像处理图像一样将音量推送到码头中心吗?

没有。您可以将Docker镜像推送到Docker中心(a.k.a。'registry');但数据不是。您可以使用您喜欢的任何方法备份/保留/共享您的数据,但将数据推送到Docker注册表以共享它没有任何意义。

我可以备份等吗?

是的,如上所述:-)


0
投票

每个容器都有自己的文件系统,独立于主机文件系统。如果使用-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 for windows使用Windows 10中的bash子系统。我会尝试为windows10运行bash并转到该文件夹​​或了解如何从Windows 10访问linux文件夹。检查此page以获取常见问题解答Windows 10中的linux子系统。

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


0
投票

挂载任何基于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
© www.soinside.com 2019 - 2024. All rights reserved.