多个主机如何共享Docker容器的数据卷?

3

https://nickjanetakis.com/blog/docker-tip-28-named-volumes-vs-path-based-volumes

似乎表明,命名卷基于路径的卷都存储在Docker主机(容器运行的地方)中。

假设我有webnginx服务。

我认为我可以在一个主机上运行web服务,在另一个主机上运行nginx服务(两台不同的机器)。 (虽然我刚开始学习Docker的基础知识,但在将服务分离到不同的主机之前,还需要很长时间)

是否有一种方法可以通过在两个服务之间共享卷来让nginx容器提供由web服务拥有的静态文件?

2个回答

4

Docker目前还没有内置的基于软件的解决方案来在多台机器之间共享卷。虽然有关于infinit的工作,但他们还没有发布任何可供生产使用的东西。

有第三方存储解决方案可供使用。如果您使用云提供商,则其解决方案通常最适合您的用例。对于自托管的软件解决方案,您可以使用类似glusterfs的东西。处理数据复制本身的应用程序非常适合容器,例如cockroachdb。

典型的自托管解决方案是退回到NFS。即使在云提供商中,我通常使用它们的NFS方法来挂载存储。从docker中,看起来像以下内容:

  # create a reusable volume
  $ docker volume create --driver local \
      --opt type=nfs \
      --opt o=nfsvers=4,addr=192.168.1.1,rw \
      --opt device=:/path/to/dir \
      foo

  # or from the docker run command
  $ docker run -it --rm \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=192.168.1.1\",volume-opt=device=:/host/path \
    foo

  # or to create a service
  $ docker service create \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=192.168.1.1\",volume-opt=device=:/host/path \
    foo

  # or inside a docker-compose file
  ...
  volumes:
    nfs-data:
      driver: local
      driver_opts:
        type: nfs
        o: nfsvers=4,addr=192.168.1.1,rw
        device: ":/path/to/dir"
  ...

请注意,只要您保持nfs的类型不变,每个IP地址都可以是主机名。

0
如果您的Docker容器在同一主机上运行,则这非常容易。您只需(作为我的示例中的一部分,但也可以单独创建)创建一个卷并将其挂载到两个容器上。
# Create a volume /data in a new container
$ docker run \
  -v /data \
  -it \
  --name mycontainer \
  ubuntu \
  /bin/bash
root@435cb561e0eb:/# touch /data/test

然后在另一个 shell 中,我启动另一个 Ubuntu 容器(不一定是 Ubuntu,也可以是其他镜像):

# Mount the same volume in another container
$ docker run \
  --volumes-from mycontainer \
  -it \
  ubuntu \
  /bin/bash
root@de70d474df7a:/# ls /data/
test

然后您只需要确保应用程序的Web部分使用该挂载点(在这种情况下是/data)来存储您需要在两个主机之间共享的数据。
至于多个主机之间的共享,Docker本身无法实现,但可以构建在NFS或其他类似技术之上来实现。

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