首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将容量从容器安装到码头主机?

如何将容量从容器安装到码头主机?
EN

Stack Overflow用户
提问于 2017-03-17 02:40:32
回答 2查看 48.3K关注 0票数 20

我对Docker的整个数据卷过程有一个疑问。基本上,这里有两个Dockerfile及其各自的运行命令:

Dockerfile 1 -

代码语言:javascript
复制
# 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 -

代码语言:javascript
复制
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 -

代码语言:javascript
复制
# 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 -

代码语言:javascript
复制
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和命令按预期工作。其中,停靠守护进程将目录从容器挂载到主机。因此,我可以随意编辑配置文件,并在重新启动时将它们持久化到容器中。

但是,对于第二个dockerfile和命令,它似乎不起作用。我知道,如果你去看Docker卷文档,它说卷挂载仅仅是单向的,从主机到容器,但是为什么传输容器按照预期工作,而Nginx容器却没有?

我正在运行MicrosoftWindows10Pro Build 14393作为我的主机,17.03.0-ce-win1 (10300) Channel: beta作为我的Docker版本。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-17 05:26:11

寄主体积不从容器>主机复制数据。主机卷位于容器/映像中的顶部,因此它们有效地将容器中的内容替换为主机上的内容。

标准或“命名”卷将将现有数据从容器映像复制到一个新卷中。这些卷是通过在其Dockerfile中启动带有VOLUME命令的容器或由docker命令创建的

代码语言:javascript
复制
docker run -v myvolume:/var/whatever myimage

默认情况下,这是存储在“本地”卷中的数据,“本地”存储在Docker主机上。在您的示例中,它位于运行Docker的VM上,而不是Windows主机上,因此您可能很难访问它。

你可能把一个空白目录中的传输自动生成文件误认为是一个副本?

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

代码语言:javascript
复制
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

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

票数 23
EN

Stack Overflow用户

发布于 2018-09-04 13:41:31

主机卷不会像命名卷那样复制数据。但是,您可以创建一个执行绑定挂载的命名卷,该卷将具有任何其他命名卷的数据初始化属性。绑定安装在主机卷上的唯一先决条件是目录必须预先存在,docker不会像对主机卷那样为您创建目录。下面是三个不同的示例,说明如何创建绑定挂载卷:

代码语言:javascript
复制
      # 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
代码语言:javascript
复制
      # inside a docker-compose file
      ...
      volumes:
        bind-test:
          driver: local
          driver_opts:
            type: none
            o: bind
            device: /home/user/test
      ...

因此,在使用docker run命令的示例中,可以使用挂载语法:

代码语言:javascript
复制
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

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

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42848279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档