在Docker容器之间共享卷

22

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

假设我有一个名为A的Docker容器,在其中挂载了一个卷到路径/data。这是它的Dockerfile:

VOLUME /data

根据我的理解,这将使容器附加一个卷,但不会将主机目录挂载到容器中。因此,该卷内的数据仍然在容器A中。

我有另一个容器B,它提供FTP服务。它访问位于卷 /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并将数据挂载到不同的挂载点,则此问题可能会有所帮助!如何使用Docker的--volumes-from映射卷路径?

1个回答

45

您可能会看到很多指针提到数据容器和--volumes-from。然而,自docker 1.9以来,卷已成为一等公民,它们可以有名称,并具有更大的灵活性:

现在很容易实现您想要的行为,这里是一个示例:

  1. Create a named data volume with name service-data:

    docker volume create --name service-data
    
  2. You can then create a container that mounts it in your /public folder by using the -v flag:

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

    For testing purpose we create a small text file in our mapped folder:

    cd public
    echo 'hello' > 'hello.txt'
    
  3. You may then attach your named volume to a second container, but this time under the data folder:

    docker run -t -i -v service-data:/data debian:jessie /bin/bash
    ls /data       #-->shows "hello.txt"
    
只需记住,如果两个容器使用不同的镜像,则需要注意所有权和权限!

如果您仍需要使用数据容器,您也可以考虑在FTP镜像中创建一个入口脚本,该脚本接收文件夹名称作为参数,并将其作为服务根目录的符号链接。 - Stéphane C.
5
记住,如果两个容器使用不同的镜像,请注意所有权和权限!您能详细说明一下吗? - CGFoX
如果第二个容器在/data目录下有一些预先存在的东西,那么会发生什么?'hello.txt'和那些预先存在的东西会共存吗?还是'hello.txt'会替换预先存在的东西?或者其他情况? - Brad Pitt
@theelee:通常存储在图像目录中的内容,完全被挂载卷的内容“隐藏”了。在我的例子中,镜像debian:jessie/data下的任何预先存在的文件都无法直接从容器实例访问。如果您需要混合原始数据和外部数据,则必须挂载单个文件而不是整个目录,但如果创建和更新随机文件,则这将很快变得难以管理。 - Stéphane C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接