Docker for Windows:访问命名卷安装
Docker for Windows: Accessing named volume mounts
请注意,这是 不是 的副本,因为早在 2017 年 [=39] 的内部运作=] 在 windows 上完全不同 - 例如docker 如今的音量检查输出已经大不相同了。
我无法通过命名卷装载访问装载到 docker for windows 中的容器的数据。
docker inspect [vol-id]
[
{
"CreatedAt": "2019-04-02T11:58:14Z",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "foo",
"com.docker.compose.version": "1.24.0",
"com.docker.compose.volume": "mongodata-foo"
},
"Mountpoint": "/var/lib/docker/volumes/foo_mongodata-foo/_data",
"Name": "foo_mongodata-payoff",
"Options": null,
"Scope": "local"
}
]
--> 挂载点位于 Docker 中使用的 HyperV VM 内。如何访问该数据?有没有一种易于管理的方法来做到这一点?
注意:我没有 C:\ProgramData\Docker\Volumes
所描述的 here。相反,使用 Docker Desktop 2.0.0.3,Engine 18.03.3 创建的是 C:\ProgramData\DockerDesktop
。据我所知,它不包含任何卷。
背景:我需要在HyperV中具有默认位置的命名安装,通过docker run -v
手动安装或指定驱动程序设备位置看起来是 unsupported by mongodb(我的行为与那里描述的完全相同。看起来 mongodb 与 NTFS 源卷安装不兼容。
方法使用内置docker cp
使用 docker cp [containername]:[path] [host-path]
例如复制数据 - 反转参数以复制数据 - 它就像 scp 一样工作。要 shell 访问数据,您只需附加到 运行ning 容器即可。
pro: docker compose
不需要额外的东西
缺点:没有与 WinSCP 等文件浏览器 GUI 集成(据我所知)。每次在主机和容器之间更新文件时都需要进行基于终端的复制。
方法使用docker化的 ssh 服务器
pro: 可以与任何可以对话的工具集成 ssh/sftp
缺点:需要额外设置
以下方法在服务中启动 ssh 服务器,使用 docker-compse 进行设置,使其自动启动并在主机和容器之间使用 public 密钥加密进行授权。这样,数据可以通过 scp 或 sftp uploaded/downloaded。
下面是 node.js(keystone)+ 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 for windows 中的容器的数据。
docker inspect [vol-id]
[
{
"CreatedAt": "2019-04-02T11:58:14Z",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "foo",
"com.docker.compose.version": "1.24.0",
"com.docker.compose.volume": "mongodata-foo"
},
"Mountpoint": "/var/lib/docker/volumes/foo_mongodata-foo/_data",
"Name": "foo_mongodata-payoff",
"Options": null,
"Scope": "local"
}
]
--> 挂载点位于 Docker 中使用的 HyperV VM 内。如何访问该数据?有没有一种易于管理的方法来做到这一点?
注意:我没有 C:\ProgramData\Docker\Volumes
所描述的 here。相反,使用 Docker Desktop 2.0.0.3,Engine 18.03.3 创建的是 C:\ProgramData\DockerDesktop
。据我所知,它不包含任何卷。
背景:我需要在HyperV中具有默认位置的命名安装,通过docker run -v
手动安装或指定驱动程序设备位置看起来是 unsupported by mongodb(我的行为与那里描述的完全相同。看起来 mongodb 与 NTFS 源卷安装不兼容。
方法使用内置docker cp
使用 docker cp [containername]:[path] [host-path]
例如复制数据 - 反转参数以复制数据 - 它就像 scp 一样工作。要 shell 访问数据,您只需附加到 运行ning 容器即可。
pro: docker compose
不需要额外的东西缺点:没有与 WinSCP 等文件浏览器 GUI 集成(据我所知)。每次在主机和容器之间更新文件时都需要进行基于终端的复制。
方法使用docker化的 ssh 服务器
pro: 可以与任何可以对话的工具集成 ssh/sftp
缺点:需要额外设置
以下方法在服务中启动 ssh 服务器,使用 docker-compse 进行设置,使其自动启动并在主机和容器之间使用 public 密钥加密进行授权。这样,数据可以通过 scp 或 sftp uploaded/downloaded。
下面是 node.js(keystone)+ 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