Docker Swarm如何实现卷共享?


93

Docker Swarm可以管理两种类型的存储:

volumebind

尽管bindDocker文档未建议这样做,因为它在本地目录(在每个群集节点上)与任务之间创建了绑定,volume但未提及实现,因此我不了解如何在任务之间共享卷?

  • Docker Swarm如何在节点之间共享卷?
  • 卷保存在哪里(在一个管理器上?如果有多个管理器?)
  • 如果节点在不同网络上的不同计算机上运行,​​节点之间是否没有问题?
  • 它会创建VPN吗?

1
Swarm是否共享卷?大约一年前,我处理了docker swarm,但我认为swarm不负责在节点之间共享卷。如果您希望节点共享相同的卷,则必须使用azure volumedriver之类的卷插件。
芒奇金

Answers:


66

您要问的是一个常见问题。卷数据和该卷可以执行的功能由卷驱动程序管理。就像你可以使用不同的网络驱动器一样overlaybridge或者host,你可以用不同的音量驱动程序。

Docker和Swarm仅随附标准local驱动程序。它对Swarm没有任何了解,它只会在计划服务任务的任何节点上为您的数据创建新卷。这通常不是您想要的。

您需要一个Swarm感知的第三方驱动程序插件,并确保您在适当的时间在正确的节点上为服务任务创建的卷可用。选项包括使用“适用于AWS / Azure的Docker”及其随附的CloudStor驱动程序,或流行的开源REX-Ray解决方案。

有许多第三方音量驱动程序,您可以在Docker Store上找到它们。


hadoop可以充当这样的共享卷吗?
stackit

55

Swarm Mode本身对卷没有任何不同,它在容器运行所在的节点上运行您提供的任何Volume Mount命令。如果您的卷安装在该节点本地,那么您的数据将本地保存在该节点上。没有内置的功能可以在节点之间自动移动数据。

有一些基于软件的分布式存储解决方案,例如GlusterFS,而Docker拥有一个名为Infinit的解决方案,该解决方案尚未实现GA,其开发已经使EE中的Kubernetes集成退居二线。

典型的结果是您需要管理应用程序内存储的复制(例如,etcd和其他基于筏的算法),或者在外部存储系统上执行挂载(希望使用其自己的HA)。挂载外部存储系统有两个选项,基于块或文件。基于块的存储(例如EBS)通常具有更高的性能,但仅限于安装在单个节点上。为此,您通常将需要一个第三方卷插件驱动程序,以使您的Docker节点可以访问该块存储。基于文件的存储(例如EFS)性能较低,但具有更高的可移植性,并且可以同时安装在多个节点上,这对于复制服务很有用。

最常见的基于文件的网络存储是NFS(这与EFS使用的协议相同)。而且您可以安装它而无需任何第三方插件驱动程序。Docker附带的不幸的是命名为“本地”的卷插件驱动程序,提供了将驱动程序选项所需的任何值传递给mount命令的选项,并且没有选项,它默认将卷存储在docker目录/ var / lib /中。码头工人/卷。使用选项,您可以向其传递NFS参数,它甚至会在NFS主机名上执行DNS查找(通常是NFS所没有的)。这是使用本地卷驱动程序挂载NFS文件系统的不同方法的示例:

  # 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

  # 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使用中看到的另一个常见问题是在服务器上启用了“ root squash”。当以root用户身份运行的容器尝试将文件写入卷时,这会导致权限问题。您还遇到类似的UID / GID权限问题,其中容器UID / GID是需要写入卷的权限的容器,这可能需要目录所有权和权限才能在NFS服务器上进行调整。


9

我的适用于AWS EFS的解决方案有效:

  1. 创建EFS(不要忘记在安全组中打开NFS端口2049)
  2. 安装nfs-common软件包:

    sudo apt-get install -y nfs-common

  3. 检查您的ef是否有效:

    mkdir efs测试点
    须藤chmod go + rw efs-test-point
    须藤安装-t nfs -o nfsvers = 4.1,rsize = 1048576,wsize = 1048576,hard,timeo = 600,retrans = 2,noresvport [YOUR_EFS_DNS]:/ efs-test-point
    触摸efs-test-point / 1.txt
    须藤umount efs-test-point /
    ls -la efs-test-point /

    目录必须为空

    须藤安装-t nfs -o nfsvers = 4.1,rsize = 1048576,wsize = 1048576,hard,timeo = 600,retrans = 2,noresvport [YOUR_EFS_DNS]:/ efs-test-point

    ls -la efs-test-point/

    文件1.txt必须存在

  4. 配置docker-compose.yml文件:

    服务:
      sidekiq:
        数量:
          -uploads_tmp_efs:/ home / application / public / uploads / tmp
      ...
    数量:
      uploads_tmp_efs:
        司机:本地
        driver_opts:
          类型:nfs
          o:addr = [YOUR_EFS_DNS],nfsvers = 4.1,rsize = 1048576,wsize = 1048576,hard,timeo = 600,retrans = 2
          设备:[YOUR_EFS_DNS]:/


6

对于本地托管的群集,我的解决方案是:每个工作程序节点都挂载了一个nfs共享,该共享由文件服务器在上提供/mnt/docker-data。在服务组合文件中定义卷时,将设备设置为下方的某个路径/mnt/docker-data,例如:

volumes:
  traefik-logs:
    driver: local
    driver_opts:
      o: bind
      device: /mnt/docker-data/services/traefik/logs
      type: none

使用此解决方案,docker在每个节点上创建卷,将服务部署到并且令人惊讶的是,已经有数据,因为它与其他节点上的卷所使用的路径相同。

如果仔细查看节点文件系统,您会发现在下方创建了我的文件服务器安装的安装/var/lib/docker/volumes,请参见此处:

root@node-3:~# df -h
Dateisystem                                                                                                   Größe Benutzt Verf. Verw% Eingehängt auf
[...]
fs.mydomain.com:/srv/shares/docker-data/services/traefik/logs                                 194G    141G   53G   73% /var/lib/docker/volumes/traefik_traefik-logs/_data
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.