在 Docker 桌面 (Windows) 中定位数据卷
Locating data volumes in Docker Desktop (Windows)
我目前正在努力学习 docker,但我对数据量实际存在的位置感到困惑。
我正在为 Windows 使用 Docker 桌面。 (Windows 10)
在文档中他们说 运行 docker 检查对象将为您提供来源: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 for windows 在 Windows 10 中使用 bash 子系统。我会尝试 运行 bash for windows10 并转到该文件夹或找出如何从 windows 10 访问 linux 文件夹。检查此 page 以获得关于 linux 子系统的常见问题解答 windows10.
更新:您还可以使用docker cp在主机和容器之间复制文件。
你的卷目录是/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 共享驱动器。
顺便说一句,Source
是主机上的位置,Destination
是以下输出中容器内的位置:
"Mounts": [
{
"Name": "fac362...80535",
"Source": "/var/lib/docker/volumes/fac362...80535/_data",
"Destination": "/webapp",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
已更新以回答评论中的问题:
My main curiosity here is that sharing images etc is great but how do I share my data?
其实volume
就是为此目的而设计的(在Docker容器中管理数据)。卷中的数据持久保存在主机 FS 上,并与 Docker container/image 的生命周期隔离。您可以通过以下方式共享您的数据:
装载 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
产生的所有数据都会持久化在容器[=23=的volume中].
更多信息请参考official Docker volumes docs.
简单地说,volumes
只是您主机上的一个目录,其中包含您所有的容器数据,因此您可以使用之前使用的任何方法来 backup/share 您的数据。
can I push a volume to docker-hub like I do with images?
没有。 Docker image 是你可以推送到 Docker hub (a.k.a. 'registry') 的东西;但数据不是。您可以使用任何您喜欢的方法 backup/persist/share 您的数据,但是将数据推送到 Docker 注册表以共享它没有任何意义。
can I make backups etc?
是的,如上所示:-)
挂载任何基于 NTFS 的目录对我的目的不起作用(MongoDB - 据我所知,至少 Redis 和 CouchDB 也是如此):NTFS 权限不允许必要的访问对于容器中的此类数据库 运行ning。以下是在 HyperV 上使用命名卷的设置。
以下方法在服务中启动 ssh 服务器,使用 docker-compse 进行设置,使其自动启动并在主机和容器之间使用 public 密钥加密进行授权。这样,数据可以通过 scp 或 sftp uploaded/downloaded。
Web 应用程序的完整 docker-compose.yml + mongodb 以及一些有关如何使用 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 容器,除非您需要远程访问文件系统 运行ning 在 Windows 主机下的容器中。
当 运行 linux 基于 windows 主机上的容器时,实际卷将存储在 linux VM 中并且在主机的 fs 上不可用, 否则 windows 运行 on windows => C:\ProgramData\Docker\volumes\
另外 docker inspect <container_id>
将列出容器配置,在 Mounts 部分下查看有关持久层的更多详细信息。
更新:
不适用于 WSL 上的 Docker 运行。
如果您启用了 wsl2,您可以在 \wsl$\docker-desktop\mnt\host\wsl\docker-desktop-data\data\docker
下的文件资源管理器中找到它
我发现我的 Docker 与 WSL 2 (Ubuntu 20.04) 的设置在 Windows 10:
C:\Users\Username\AppData\Local\Docker\wsl\data\ext4.vhdx
其中 Username
是您的用户名。
我正在使用 Windows + WSL 2 (Ubuntu 18.04),Docker v19.03。
我在这个位置找到了我的 Docker 卷,在 Windows 文件浏览器中输入:
\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\
每一卷将有一个目录。
如果您使用 windows 并使用 Docker 对于 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
如果您在放置指向 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 version 20.10.2, build 2291f61
Docker 工件可以在
中找到
DOCKER_ARTIFACTS == \wsl$\docker-desktop-data\version-pack-data\community\docker
数据量可以在
DOCKER_ARTIFACTS\volumes\[VOLUME_ID]\_data
您可以在 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、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”只是链接或映射到真实文件夹,就像那样
如果您使用 windows,您的 docker 文件(在本例中是您的卷)存在于 docker 用于 windows 的虚拟机上 Hyper-V 或 WSL。但是,如果您需要访问这些文件,您可以复制容器文件并将它们存储在本地计算机上,然后以这种方式访问数据。
docker cp container_Id_Here:/var/lib/mysql path_To_Your_Local_Machine_Here
我目前正在努力学习 docker,但我对数据量实际存在的位置感到困惑。
我正在为 Windows 使用 Docker 桌面。 (Windows 10)
在文档中他们说 运行 docker 检查对象将为您提供来源: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 for windows 在 Windows 10 中使用 bash 子系统。我会尝试 运行 bash for windows10 并转到该文件夹或找出如何从 windows 10 访问 linux 文件夹。检查此 page 以获得关于 linux 子系统的常见问题解答 windows10.
更新:您还可以使用docker cp在主机和容器之间复制文件。
你的卷目录是/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 共享驱动器。
顺便说一句,Source
是主机上的位置,Destination
是以下输出中容器内的位置:
"Mounts": [
{
"Name": "fac362...80535",
"Source": "/var/lib/docker/volumes/fac362...80535/_data",
"Destination": "/webapp",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
已更新以回答评论中的问题:
My main curiosity here is that sharing images etc is great but how do I share my data?
其实volume
就是为此目的而设计的(在Docker容器中管理数据)。卷中的数据持久保存在主机 FS 上,并与 Docker container/image 的生命周期隔离。您可以通过以下方式共享您的数据:
装载 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
产生的所有数据都会持久化在容器[=23=的volume中].
更多信息请参考official Docker volumes docs.
简单地说,volumes
只是您主机上的一个目录,其中包含您所有的容器数据,因此您可以使用之前使用的任何方法来 backup/share 您的数据。
can I push a volume to docker-hub like I do with images?
没有。 Docker image 是你可以推送到 Docker hub (a.k.a. 'registry') 的东西;但数据不是。您可以使用任何您喜欢的方法 backup/persist/share 您的数据,但是将数据推送到 Docker 注册表以共享它没有任何意义。
can I make backups etc?
是的,如上所示:-)
挂载任何基于 NTFS 的目录对我的目的不起作用(MongoDB - 据我所知,至少 Redis 和 CouchDB 也是如此):NTFS 权限不允许必要的访问对于容器中的此类数据库 运行ning。以下是在 HyperV 上使用命名卷的设置。
以下方法在服务中启动 ssh 服务器,使用 docker-compse 进行设置,使其自动启动并在主机和容器之间使用 public 密钥加密进行授权。这样,数据可以通过 scp 或 sftp uploaded/downloaded。
Web 应用程序的完整 docker-compose.yml + mongodb 以及一些有关如何使用 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 容器,除非您需要远程访问文件系统 运行ning 在 Windows 主机下的容器中。
当 运行 linux 基于 windows 主机上的容器时,实际卷将存储在 linux VM 中并且在主机的 fs 上不可用, 否则 windows 运行 on windows => C:\ProgramData\Docker\volumes\
另外 docker inspect <container_id>
将列出容器配置,在 Mounts 部分下查看有关持久层的更多详细信息。
更新: 不适用于 WSL 上的 Docker 运行。
如果您启用了 wsl2,您可以在 \wsl$\docker-desktop\mnt\host\wsl\docker-desktop-data\data\docker
我发现我的 Docker 与 WSL 2 (Ubuntu 20.04) 的设置在 Windows 10:
C:\Users\Username\AppData\Local\Docker\wsl\data\ext4.vhdx
其中 Username
是您的用户名。
我正在使用 Windows + WSL 2 (Ubuntu 18.04),Docker v19.03。 我在这个位置找到了我的 Docker 卷,在 Windows 文件浏览器中输入:
\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\
每一卷将有一个目录。
如果您使用 windows 并使用 Docker 对于 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
如果您在放置指向 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 version 20.10.2, build 2291f61
Docker 工件可以在
中找到DOCKER_ARTIFACTS == \wsl$\docker-desktop-data\version-pack-data\community\docker
数据量可以在
DOCKER_ARTIFACTS\volumes\[VOLUME_ID]\_data
您可以在 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、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”只是链接或映射到真实文件夹,就像那样
如果您使用 windows,您的 docker 文件(在本例中是您的卷)存在于 docker 用于 windows 的虚拟机上 Hyper-V 或 WSL。但是,如果您需要访问这些文件,您可以复制容器文件并将它们存储在本地计算机上,然后以这种方式访问数据。
docker cp container_Id_Here:/var/lib/mysql path_To_Your_Local_Machine_Here