【问题标题】:Docker swarm having some shared volumeDocker swarm 有一些共享卷
【发布时间】:2018-07-10 15:15:57
【问题描述】:

我将尝试描述我想要的功能:
我正在运行 docker swarm 超过 docker-compose 在 docker-compose 中,我有服务,为简单起见,我们称它为 ABC

假设包含共享代码模块的C服务需要AB服务可访问。

我的问题是:
1. 如果需要访问共享卷的每个服务都必须将C 服务挂载到其自己的本地文件夹,(使用下面的卷部分)或者可以在不挂载/复制到本地容器中的路径的情况下访问它。

  1. 在 docker swarm 中,可能有两个服务实例 AB 将驻留在计算机 X 上,而服务 C 将驻留在计算机 Y 上。 是不是因为服务都维护在同一个dockerswarm stack下,所以和C的服务通信没有问题。

如果不是,它应该实现哪些定义? 我的结构是这样的:

version: "3.4"

services:
  A:        
    build: .
    volumes:
      - C:/usr/src/C
    depends_on:
      - C


  B:
    build: .
    volumes:
      - C:/usr/src/C

    depends_on:
      - C

  C:
    image: repository.com/C:1.0.0
    volumes:
      - C:/shared_code

volumes:
     C:

【问题讨论】:

    标签: docker docker-compose docker-swarm


    【解决方案1】:

    如果你分享的是代码,你应该将它构建到实际的 Docker 镜像中,而不是尝试为此使用卷。

    您将遇到两个大问题。一个是在多主机安装中正确共享卷。第二个是一个更长期的问题:如果共享代码发生变化,你会怎么做?您不能只使用共享代码重新部署 C 模块,因为保存代码的卷已经存在;您需要单独更新卷中的代码,重新启动依赖服务,并希望它们都能正常工作。实际上,将代码烘焙到图像中可以在尝试部署之前测试完整的设置。

    【讨论】:

    • 您能否就我在docker-compose 示例中尝试描述的高级方式提供正确工作的建议?
    【解决方案2】:

    在 Swarm 等分布式模型中,共享代码是一种反模式。就像 David 说的那样,即使存在重复数据,您也需要在镜像构建中使用该代码。有很多方法可以在其他图像之上构建图像以限制重复数据。

    如果您仍需要在文件系统上的 swarm 中的容器之间共享数据,则需要查看一些共享存储,例如 AWS EFS(多节点读/写)和 REX-Ray,以便将数据传输到正确的容器。

    另外,depends_on 不能在 swarm 中工作。分布式系统中的应用程序需要以可预测的方式处理与其他服务的连接缺失问题。也许他们只是退出(并且 swarm 将重新创建它们)或进入代码中的重试循环等。depends_on 对本地 docker-compose cli 在开发中意味着你想通过执行来启动应用程序及其依赖项类似于docker-compose up api

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多