我现在正试图学习码头工具,而且我对数据量实际存在的位置感到困惑。
我正在使用 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"
}
]
任何人都可以帮助我吗?我只是想知道我的数据量实际存在于我的主机上的位置?如果是这样,我怎么能找到它的路径呢?
答案 0 :(得分:49)
我在Windows + WSL 2(Ubuntu 18.04),Docker v19.03上。 我在此位置找到了Docker卷,输入Windows文件浏览器:
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\
每卷将有一个目录。
答案 1 :(得分:23)
您的卷目录为/var/lib/docker/volumes/blog_postgres-data/_data
,/var/lib/docker
通常安装在C:\Users\Public\Documents\Hyper-V\Virtual hard disks
中。无论如何,您可以通过查看Docker设置来查看它。
有关如何在Windows上与Docker共享驱动器的信息,请参阅these docs。
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-from
docker run -d --volumes-from dbstore --name db1 training/postgres
基于此容器运行其他容器,然后db1
生成的所有数据将保留在容器dbstore
的卷中。
有关详细信息,请参阅official Docker volumes docs。
简单来说,volumes
只是主机上包含所有容器数据的目录,因此您可以使用以前用于备份/共享数据的任何方法。
我可以像处理图像一样将音量推送到码头中心吗?
没有。 Docker image 可以推送到Docker中心(a.k.a。' registry');但数据不是。您可以使用任何您喜欢的方法备份/保存/共享数据,但将数据推送到Docker注册表以共享它没有任何意义。
我可以进行备份等吗?
是的,如上所述: - )
答案 2 :(得分:21)
对于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
答案 3 :(得分:14)
在Windows主机上运行基于linux的容器时,实际卷将存储在linux VM中,而在主机的fs上将不可用,否则Windows在Windows上运行=> C:\ ProgramData \ Docker \ volumes \ < / p>
docker inspect <container_id>
还将列出容器配置,在“挂载”部分下,查看有关持久层的更多详细信息。
更新: 不适用于在WSL上运行的Docker。
答案 4 :(得分:5)
如果启用了wsl2,则可以在\\wsl$\docker-desktop\mnt\host\wsl\docker-desktop-data\data\docker
下的文件浏览器中找到它
答案 5 :(得分:5)
您可以在 Docker Desktop(Windows) 的以下路径中找到与主机关联的卷
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes
答案 6 :(得分:4)
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\
也为我工作(Windows 10 家庭版),很棒的东西。
答案 7 :(得分:2)
就我而言,我在 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”只是链接或映射到真实文件夹,就像那样
答案 8 :(得分:1)
我发现我的带有WSL 2(Ubuntu 20.04)的Docker设置使用以下位置:
C:\Users\UserName\AppData\Local\Docker\wsl\data\ext4.vhdx
UserName
是您的用户名。
答案 9 :(得分: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
希望它有帮助:)
答案 10 :(得分: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在主机和容器之间复制文件。
答案 11 :(得分: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
答案 12 :(得分:0)
docker run -it --name hello-volume1 -v / mnt / c / sharedDocker:/ data ubuntu bash
此命令没有错误。但是“ c:\ sharedDocker”中没有文件。该文件在Windows资源管理器中不可见。 ,应该出现在目录中的这些文件就是容器中数据目录中的文件。
我搜索了两天,但是在Internet上找不到它。 我不知道你在说什么
但是
docker cp /data/test.txt / c / sharedDocker
我知道这一点。
ps:
docker run -it --name hello-volume1 -v / c / sharedDocker:/ data ubuntu bash
此命令中也没有错误。但不在窗口浏览器中。
答案 13 :(得分: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