Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Docker中将卷从容器装载到主机?_Docker - Fatal编程技术网

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

如何在Docker中将卷从容器装载到主机?,docker,Docker,我有一个关于Docker中整个数据量过程的问题。这里基本上有两个DockerFile及其各自的运行命令: 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 t

我有一个关于Docker中整个数据量过程的问题。这里基本上有两个DockerFile及其各自的运行命令:

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"]
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  
# 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;"]
docker run --name nginx -d -p 80:80 -v C:\path\to\config:/etc/nginx -v C:\path\to\html:/var/www/html nginx
命令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"]
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  
# 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;"]
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 2-

# 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"]
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  
# 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;"]
docker run --name nginx -d -p 80:80 -v C:\path\to\config:/etc/nginx -v C:\path\to\html:/var/www/html nginx
命令2-

# 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"]
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  
# 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;"]
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文档,它会说卷装载只是单向的,从主机到容器,但是为什么Transmission容器能按预期工作,而Nginx容器却不能

p:S-我的主机是Microsoft Windows 10 Pro Build 14393,Docker版本是17.03.0-ce-win1(10300)Channel:beta

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

不要从容器>主机复制数据。主机卷装载在容器/映像中的内容的顶部,因此它们有效地将容器中的内容替换为主机上的内容

将现有数据从容器映像复制到新卷中。这些卷是通过在容器的Dockerfile中使用命令启动容器或通过docker命令创建的

docker run -v myvolume:/var/whatever myimage
默认情况下,这是存储在Docker主机上的“本地”卷中的数据。在您的情况下,它位于运行Docker的VM上,而不是您的Windows主机上,因此您可能无法轻松访问它

您可能将空白目录中的传输自动生成文件误认为是副本

如果确实需要保留VM主机>容器映射,则可能必须手动复制数据:

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
命令的示例中,您可以使用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

唯一需要调整的部分是docker在HyperV中运行的Linux虚拟机中的windows路径名。

什么“不工作”?容器是否无法启动?本地文件是否显示在装载的目录中,但未更新?挂载的目录中有任何内容吗?@Matt我正在尝试将文件从Nginx容器中获取到主机。第一个容器(传输)通过使用数据卷在这方面工作。但是,对于第二个容器(Nginx),它不希望将装载目录中的文件从容器内部复制到主机。尽管其他一切都正常,但它确实成功启动。请用这些信息更新您的问题。您能再解释一下标准卷吗?您所说的“将容器映像中的现有数据复制到新卷”是什么意思。基本上,当docker为Dockerfile
volume
docker run-v volume:/where
创建新卷时,它将使用容器映像中目标装载点中已存在的内容填充该卷(
/where
)。这是您要寻找的行为,但您不需要在主机上指定位置,也没有映射到Windows。好吧,这有点道理,但有一点我仍然感到困惑。为什么传输容器会将文件复制到主机上的目录,而Nginx容器却没有?Cat正在尝试将所有配置移到其他位置,然后再次启动容器。当配置丢失时,传输是否重新创建配置?是的。然而,这是一个全新的配置。这意味着它的设置与我移动的不一样。