从多个主机共享docker卷?

时间:2018-04-28 12:41:16

标签: docker

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

似乎表明named volumespath based volumes都存储在docker主机中(运行容器)

假设我有webnginx服务。

我以为我可以在一台主机上运行web服务,在另一台主机(两台不同的机器)上运行nginx。 (虽然我刚刚开始学习码头工具的基础知识,但在我将服务分离到不同的主机之前已经很长时间了)

nginx容器是否有办法通过在两者之间共享卷来提供web服务所拥有的静态文件?

2 个答案:

答案 0 :(得分:0)

如果您的docker容器在同一主机上运行,​​那么这很容易。您只是(作为我示例中run的一部分,但可以单独创建)创建一个卷并将其挂载到两个容器上。

# 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之上或者其他东西来实现它。

答案 1 :(得分:0)

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地址中的IP地址都可以是主机名。