Docker Swarm节点之间的卷不共享

9

我在不同Docker Swarm节点上运行的容器之间共享文件夹存在问题。我的Swarm由一个管理者和两个工作节点组成。

我正在使用这个compose文件部署应用程序:

version: '3'

services:

  redis:
    image:
      redis:latest
    networks:
      - default
    ports:
      - 6379:6379
    volumes:
      - test-volume:/test
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
      placement:
        constraints: [node.role == manager]

  logstash:
    image: docker.elastic.co/logstash/logstash:5.2.2
    networks:
      - default
    volumes:
      - test-volume:/test
    deploy:
      placement:
        constraints: [node.role == worker]

networks:
  default:
    external: false

volumes:
  test-volume:

我可以确认使用docker exec _id_ ls /test成功地将文件夹挂载到两个容器中。但是当我使用docker exec _id_ touch /test/file向此文件夹中添加文件时,第二个容器无法看到所创建的文件。

如何配置集群,使得两个容器都可以看到这些文件?


我找到了这篇文章:也许它会有用:https://ender74.github.io/Sharing-Volumes-With-Docker-Swarm/。我不知道它是这样工作的,正如某人回答的那样 - 可能需要插件来实现您的目标。 - barat
1个回答

33
通过默认驱动程序在docker swarm中创建的卷是本地节点的。因此,如果您将两个容器放在同一主机上,则它们将共享一个卷。但是,当您将容器放在不同的节点上时,每个节点上都会创建一个单独的卷。
为了实现跨多个节点的绑定挂载/卷,您有以下选项:
1. 使用像glusterfs、ceph等集群文件系统跨swarm节点,然后在服务定义中使用绑定挂载指向共享fs。 2. 使用提供共享存储的docker可用的众多存储驱动程序之一,如flocker等。 3. 切换到Kubernetes,并利用Storage classes和claims通过多个后端自动进行卷配给。
更新:如@Krishna在评论中所述,Flocker已关闭,并且github repo上没有太多活动。

7
Flocker已经关闭,Github代码库上也没有太多活动。 - Krishna
所以基本上唯一的选择是使用群集文件系统进行绑定挂载?目前,我将我的Postgres容器放置在群集中唯一的管理器上,其中使用传统的本地卷。你有其他建议吗? - Yannic Hamann

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