【问题标题】:Sharing volume between Docker containers在 Docker 容器之间共享卷
【发布时间】:2016-05-03 09:25:00
【问题描述】:

我正在使用 Docker 部署一些服务,我想在不同的容器之间共享 Docker 卷。

假设我有一个 Docker 容器 A,它在 /data 上安装了一个卷。这是它的 Dockerfile:

VOLUME /data

据我了解,这会将卷附加到容器,但不会将主机目录挂载到容器。所以这个volume里面的数据还在容器A里面。

我有另一个提供 FTP 服务的容器 B。它访问卷 /public 下的数据。它的 Dockerfile 是:

VOLUME /public

现在我想将它们链接在一起,以便我可以使用 B 来管理 A 的数据。从Docker文档https://docs.docker.com/engine/userguide/containers/dockervolumes/我将使用--volumes-from标志将A的数据卷挂载到B。但是这个命令会将A的数据挂载到B中的/data而不是/public,在这种情况下,容器B无法访问数据。我没有看到任何重命名挂载点的方法。

有什么建议或最佳实践来处理这个案例吗?


仅数据容器为这种情况提供了一个很好的解决方案。但是如果你想使用volumes-from并将数据挂载到不同的挂载点,这个问题可能会有所帮助! How to map volume paths using Docker's --volumes-from?

【问题讨论】:

    标签: docker dockerfile


    【解决方案1】:

    您可能会发现很多指针提到纯数据容器和--volumes-from。然而,从 docker 1.9 开始,volumes 已经成为一等公民,它们可以有名字,并且具有更大的灵活性:

    现在很容易实现你想要的行为,这里有一个例子:

    1. 创建一个名为service-data的命名数据卷:

      docker volume create --name service-data
      
    2. 然后您可以使用-v 标志创建一个将其挂载到/public 文件夹中的容器:

      docker run -t -i -v service-data:/public debian:jessie /bin/bash
      

      出于测试目的,我们在映射文件夹中创建了一个小文本文件:

      cd public
      echo 'hello' > 'hello.txt'
      
    3. 然后您可以将命名卷附加到第二个容器,但这次是在数据文件夹下:

      docker run -t -i -v service-data:/data debian:jessie /bin/bash
      ls /data       #-->shows "hello.txt"
      

    请记住,如果两个容器使用不同的图像,请注意所有权和权限!

    【讨论】:

    • 如果您仍需要使用纯数据容器,您还可以考虑在 FTP 映像中创建一个入口点脚本,该脚本接收参数中的文件夹名称并将其符号链接为服务根目录。
    • "请记住,如果两个容器使用不同的图像,请注意所有权和权限!"你能详细说明一下吗?
    • 如果第二个容器在 /data 目录下有一些预先存在的东西,那么会发生什么? 'hello.txt' 和那些预先存在的东西并存?或者“hello.txt”替换已有的东西?不然呢?
    • @theelee 通常驻留在映像目录中的内容完全被已安装卷的内容“隐藏”。在我的示例中,图像debian:jessie/data 下的任何预先存在的文件都不能从容器实例直接访问。如果您需要混合原始数据和外部数据,则必须挂载单个文件而不是整个目录,但如果创建和更新随机文件,很快就会变得难以管理。
    猜你喜欢
    • 1970-01-01
    • 2021-10-10
    • 2017-11-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    相关资源
    最近更新 更多