如何在Docker中将卷从容器挂载到主机?

Cat*_*Cat 11 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"]
Run Code Online (Sandbox Code Playgroud)

命令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  
Run Code Online (Sandbox Code Playgroud)

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;"]
Run Code Online (Sandbox Code Playgroud)

命令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
Run Code Online (Sandbox Code Playgroud)

所以,奇怪的是第一个dockerfile和命令按预期工作.docker守护程序将容器中的目录挂载到主机的位置.所以,我可以随意编辑配置文件,并在重启时将它们保存到容器中.

但是,至于第二个dockerfile和命令它似乎不起作用.我知道如果你去Docker Volume文档,它说容量挂载只是单向,从主机到容器,但是如何传输容器按预期工作,而Nginx容器不工作?

P:S - 我正在运行Microsoft Windows 10 Pro Build 14393作为我的主机和版本17.03.0-ce-win1(10300)频道:beta作为我的Docker版本.

编辑 - 只是为了澄清.我正在尝试从Nginx容器内部获取文件到主机.通过使用数据卷,第一个容器(Transmission)就此工作.但是,对于第二个容器(Nginx),它不希望将装入目录中的文件从容器内部复制到主机.其他一切都在工作,它确实成功启动.

Mat*_*att 13

主机卷不会从容器>主机复制数据.主机卷安装在容器/映像中的顶部,因此它们可以有效地用主机上的内容替换容器中的内容.

标准或"命名"卷 现有数据从容器映像复制到新卷中.这些卷是通过VOLUME在其Dockerfile 中使用命令启动容器或通过docker命令创建的

docker run -v myvolume:/var/whatever myimage
Run Code Online (Sandbox Code Playgroud)

默认情况下,这是存储在"本地"卷中的数据,"本地"位于Docker主机上.在您运行Docker而不是Windows主机的VM上,您可能无法轻松访问.

你可能会误将传输自动生成文件误认为副本的空白目录?

如果确实需要保留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
Run Code Online (Sandbox Code Playgroud)

然后,您可以将填充的主机目录映射到容器中,它们将具有映像附带的默认数据.


BMi*_*tch 6

主机卷将不会像命名卷那样复制数据。但是,您可以创建一个执行绑定安装的命名卷,然后该命名卷将具有任何其他命名卷的数据初始化属性。在主机卷上进行绑定安装的唯一先决条件是该目录必须预先存在,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
  ...
Run Code Online (Sandbox Code Playgroud)

因此,在带有docker run命令的示例中,可以使用mount语法:

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
Run Code Online (Sandbox Code Playgroud)

唯一需要调整的部分是Docker在HyperV中运行的Linux VM中的Windows路径名。