[英]How is docker able to mount a volume from docker client into a docker container running on docker host?
[英]How to mount volume from container to host in Docker?
我有一个关于 Docker 中整个数据量过程的问题。 基本上这里有两个 Dockerfiles 和它们各自的运行命令:
Dockerfile 1 -
# Transmission over Debian
#
# Version 2.92
FROM debian:testing
RUN apt-get update \
&& apt-get -y install nano \
&& apt-get -y install transmission-daemon transmission-common transmission-cli \
&& mkdir -p /transmission/config /transmission/watch /transmission/download
ENTRYPOINT ["transmission-daemon", "--foreground"]
CMD ["--config-dir", "/transmission/config", "--watch-dir", "/transmission/watch", "--download-dir", "/transmission/download", "--allowed", "*", "--no-blocklist", "--no-auth", "--no-dht", "--no-lpd", "--encryption-preferred"]
命令 1 -
docker run --name transmission -d -p 9091:9091 -v C:\path\to\config:/transmission/config -v C:\path\to\watch:/transmission/watch -v C:\path\to\download:/transmission/download transmission
Dockerfile 2 -
# Nginx over Debian
#
# Version 1.10.3
FROM debian:testing
RUN apt-get update \
&& apt-get -y install nano \
&& apt-get -y install nginx
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
命令 2 -
docker run --name nginx -d -p 80:80 -v C:\path\to\config:/etc/nginx -v C:\path\to\html:/var/www/html nginx
所以,奇怪的是第一个 dockerfile 和命令按预期工作。 docker 守护进程将目录从容器挂载到主机的位置。 因此,我可以随意编辑配置文件,并且它们将在重新启动时持久保存到容器中。
但是,对于第二个 dockerfile 和命令,它似乎不起作用。 我知道如果你去 Docker Volume 文档,它说卷挂载只是为了单向,从主机到容器,但是传输容器如何按预期工作,而 Nginx 容器却没有?
P:S - 我正在运行Microsoft Windows 10 Pro Build 14393作为我的主机和版本 17.03.0-ce-win1 (10300) Channel: beta作为我的 Docker 版本。
编辑 - 只是为了澄清。 我正在尝试将文件从 Nginx 容器内部获取到主机。 第一个容器(传输)通过使用数据卷在这方面起作用。 但是,对于第二个容器(Nginx),它不想将挂载目录中的文件从容器内部复制到主机。 其他一切正常,但它确实成功启动。
主机卷不会从容器 > 主机复制数据。 主机卷安装在容器/映像中的顶部,因此它们有效地将容器中的内容替换为主机上的内容。
标准或“命名”卷会将现有数据从容器映像复制到新卷中。 这些卷是通过使用 Dockerfile 中的VOLUME
命令或 docker 命令启动容器来创建的
docker run -v myvolume:/var/whatever myimage
默认情况下,这是存储在“本地”卷中的数据,“本地”位于 Docker 主机上。 在您的情况下,它位于运行 Docker 的 VM 上,而不是您的 Windows 主机上,因此您可能无法轻松访问。
您可能将空白目录中的传输自动生成文件误认为是副本?
如果您确实需要保留 VM Host > 容器映射,那么您可能需要手动复制数据:
docker create --name nginxcopy nginx
docker cp nginxcopy:/etc/nginx C:\path\to\config
docker cp nginxcopy:/var/www/html C:\path\to\html
docker rm nginxcopy
然后你可以将填充的主机目录映射到容器中,它们将拥有图像附带的默认数据。
主机卷不会像命名卷那样复制数据。 但是,您可以创建一个执行绑定安装的命名卷,然后它将具有任何其他命名卷的数据初始化属性。 在主机卷上绑定挂载的唯一先决条件是目录必须事先存在,docker 不会像使用主机卷那样为您创建它。 以下是如何创建绑定安装卷的三个不同示例:
# create the volume in advance
$ docker volume create --driver local \
--opt type=none \
--opt device=/home/user/test \
--opt o=bind \
test_vol
# create on the fly with --mount
$ docker run -it --rm \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \
foo
# inside a docker-compose file
...
volumes:
bind-test:
driver: local
driver_opts:
type: none
o: bind
device: /home/user/test
...
因此,在您使用docker run
命令的示例中,您可以使用挂载语法:
docker run --name nginx -d -p 80:80 \
--mount type=volume,dst=/etc/nginx,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/c/path/to/config \
--mount type=volume,dst=/var/www/html,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/c/path/to/html \
nginx
唯一可能需要调整的部分是 docker 在 HyperV 中运行的 Linux VM 内的 Windows 路径名。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.