当前位置: 首页 > 面试题库 >

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

司马洲
2023-03-14
问题内容

我对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"]

命令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文档,它说卷安装只打算从主机到容器单向进行,但是Transmission容器如何按预期工作,而Nginx容器却没有?

P:S-我正在将 Microsoft Windows 10 Pro Build 14393 作为主机运行,并将 版本17.03.0-ce-
win1(10300)通道:beta
作为我的Docker版本。

编辑-
只是为了澄清。我正在尝试将文件从Nginx容器内部发送到主机。在这方面,第一个容器(传输)通过使用数据量来工作。但是,对于第二个容器(Nginx),它不想将已安装目录中的文件从容器内部复制到主机。尽管其他所有工作都正常,但确实可以成功启动。


问题答案:

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

标准或“命名”卷
容器数据中的现有数据复制到新卷中。这些卷是通过VOLUME在Dockerfile
中使用命令启动容器或通过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

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



 类似资料:
  • 问题内容: 原始问题:如何在Dockerfile中使用VOLUME指令? 我要解决的实际问题是-如何在构建期间将主机卷挂载到Dockerfile中的Docker容器中,即在期间具有该功能。 对我而言,其背后的原因是在Docker中构建东西时,我不希望将()缓存锁定在单个Docker中,而是共享/重用它们。这就是我问这个问题的主要原因。 最近更新: 在docker v18.09之前,正确的答案应该是

  • 问题内容: 示例(为简便起见,省略了许多选项): 这是错误的,因为没有名称名称的卷,这意味着该卷名称必须是文件的完整路径(即,您不能在该卷名称后附加路径)? 尝试设置只会返回错误。 有没有办法将单个文件安装到容器中? 问题答案: 您不能在命名卷中装入文件或子目录,源是命名卷或主机路径。NFS本身,以及您将在Linux中挂载的大多数文件系统,都要求您挂载整个文件系统,而不是单个文件,当下降到inod

  • 问题内容: 在Docker容器中挂载主机目录非常容易。 但是我需要另一种方式。 我使用Docker容器作为开发环境来开发WordPress插件。该Docker容器包含运行WordPress所需的一切(MySQL,Apache,PHP和WordPress)。我从Docker容器中的主机挂载了我的插件src文件夹,以便可以在开发期间测试我的插件。 对于调试,如果我在主机上运行的IDE具有对Docker

  • 假设我有一个应用程序具有这个简单的DockerFile: 然后我运行了一个容器: 所以它工作正常,并将一些日志存储在docker容器的中。 我也看到docker-mount目录从容器到主机,但它并没有解决我的问题我需要一种方法备份我的文件从Docker到主机。

  • 问题内容: 我有一个正在进行dockerizing的开发环境,并且我希望能够实时重新加载所做的更改而不必重建docker映像。我使用docker compose是因为redis是我应用程序的依赖项之一,我喜欢能够链接redis容器 我在我的中定义了两个容器: 我已经到了我应用程序的dockerfile中添加卷的地步,但是如何将主机的目录挂载到卷中,以便对代码的所有实时编辑都可以反映在容器中? 这是

  • 问题内容: 我有这个容器基于(但是与我有相同的问题,这并不是很相关)。我到达需要的地方 我得到 我在任何内核日志中都找不到任何东西,而且没有任何有趣的结果。我显然可以在主机上执行此操作(使用任何其他对子树/节点)。在我上面的示例中,/ htdocs / www是Docker卷的安装点,但它似乎没有任何意义,因为容器内没有任何一对子树/节点。 问题答案: 要使用系统调用,您需要具备此功能。默认情况下