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

在Docker Desktop(Windows)中查找数据卷,docker,docker-for-windows,docker-desktop,Docker,Docker For Windows,Docker Desktop,我现在正试图学习docker,但我对数据卷实际存在的位置感到困惑 我正在使用Windows的Docker桌面。(视窗10) 在文档中,他们说在对象上运行docker inspect将为您提供源代码: 但是,我没有看到这一点,我得到以下信息: $ docker inspect blog_postgres-data [ { "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/do

我现在正试图学习docker,但我对数据卷实际存在的位置感到困惑

我正在使用Windows的Docker桌面。(视窗10)

在文档中,他们说在对象上运行docker inspect将为您提供源代码:

但是,我没有看到这一点,我得到以下信息:

$ 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\u postgres-data/\u data
中找到该文件系统。如果删除容器(
docker-rm
),则此数据将被删除,因此最好装载文件夹

至于您可以从windows访问这些数据的问题。据我所知,docker for windows在windows 10中使用bash子系统。我会尝试运行bash for windows10并转到该文件夹,或者了解如何从windows10访问linux文件夹。有关windows 10中linux子系统的常见问题,请查看此项


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

您的卷目录是
/var/lib/docker/volumes/blog\u postgres-data/\u data
,并且
/var/lib/docker
通常安装在
C:\Users\Public\Documents\Hyper-V\虚拟硬盘中。无论如何,您可以通过查看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容器/映像的生命周期隔离。您可以通过以下方式在卷中共享数据:

  • 将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
    的卷中

有关更多信息,请参阅

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

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

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

我可以做备份吗


是的,如上所述:-)

装载任何基于NTFS的目录对我来说都不起作用(MongoDB-据我所知,Redis和CouchDB至少也是如此):NTFS权限不允许对容器中运行的此类DBs进行必要的访问。以下是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

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

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

另外,
docker inspect
将列出容器配置,在Mounts部分下查看关于持久层的更多详细信息

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

如果您启用了wsl2,您可以在文件资源管理器中的
\\wsl$\Docker desktop\mnt\host\wsl\Docker desktop data\data\Docker
下找到它。我发现我使用wsl2(Ubuntu 20.04)设置Docker时使用了以下位置:

C:\Users\UserName\AppData\Local\Docker\wsl\data\ext4.vhdx
其中,
UserName
是您的用户名。

我使用的是Windows+WSL2(Ubuntu 18.04),Docker v19.03。 我在此位置找到Docker卷,请在Windows文件资源管理器中键入:

\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\
每个卷将有一个目录
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\
# 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
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
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\
\\wsl$\docker-desktop-data\version-pack-data\community\docker\overlay2
\\wsl$\docker-desktop-data\version-pack-data\community\docker