173

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

我正在使用Docker Desktop for 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"
    }
]

谁能帮我?我只想知道我的数据量实际存在于我的主机上吗?如果是这样,我怎样才能得到它的路径?

4

13 回答 13

338

我使用的是 Windows + WSL 2 (Ubuntu 18.04),Docker v19.03。我在这个位置找到了我的 Docker 卷,在 Windows 文件资源管理器中输入:

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

每个卷都有一个目录。

于 2020-10-18T20:33:41.957 回答
78

您的卷目录是/var/lib/docker/volumes/blog_postgres-data/_data,并且/var/lib/docker通常安装在C:\Users\Public\Documents\Hyper-V\Virtual hard disks. 无论如何,您可以通过查看 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": ""
}
]

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

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

实际上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都将持久化在容器的volume中dbstore

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

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

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

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

我可以做备份等吗?

是的,正如上面发布的:-)

于 2017-04-03T11:00:08.227 回答
40

为了Windows 10 + WSL 2 (Ubuntu 20.04), Docker version 20.10.2, build 2291f61

Docker 工件可以在

DOCKER_ARTIFACTS == \\wsl$\docker-desktop-data\version-pack-data\community\docker

数据量可以在

在此处输入图像描述

DOCKER_ARTIFACTS\volumes\[VOLUME_ID]\_data

在此处输入图像描述

于 2021-02-14T15:41:13.593 回答
22
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\

也为我工作(Windows 10 Home),很棒的东西。

于 2021-03-24T16:56:49.570 回答
20

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

还将列出容器配置,在docker inspect <container_id>Mounts 部分下查看有关持久层的更多详细信息。

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

于 2020-03-16T00:39:40.393 回答
13

我发现我使用 WSL 2 (Ubuntu 20.04) 设置的 Docker 在 Windows 10 上使用了这个位置:

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

你的用户名在哪里Username

于 2020-09-08T10:00:12.400 回答
11

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

于 2020-08-31T09:27:26.317 回答
9

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

\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes
于 2021-03-19T12:56:27.073 回答
6

就我而言,我在 wsl2、windows 10 home 上安装了 docker-desktop。我找到我的图像文件

\\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”只是链接或映射到真正的文件夹,就像那样

于 2021-04-21T01:23:56.993 回答
2

挂载任何基于 NTFS 的目录对我的目的不起作用(MongoDB - 据我所知,至少 Redis 和 CouchDB 也是如此):NTFS 权限不允许对在容器中运行的此类数据库进行必要的访问。以下是 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,因此可能不再需要上述 sshd 容器,除非您需要远程访问在 Windows 主机下的容器中运行的文件系统。

于 2019-04-03T08:38:51.197 回答
1

如果您在放置指向 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

希望它有所帮助:)

于 2021-01-26T03:49:59.710 回答
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 访问这些数据的问题。据我所知,Windows 的 docker 使用 Windows 10 中的 bash 子系统。我会尝试为 Windows10 运行 bash 并转到该文件夹​​或了解如何从 Windows 10 访问 linux 文件夹。查看此页面以获取有关的常见问题解答Windows 10 中的 linux 子系统。

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

于 2017-04-03T10:20:25.197 回答
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
于 2020-10-31T04:46:15.507 回答