如何使用Docker Swarm模式在容器之间共享数据?

时间:2018-05-02 14:03:06

标签: docker docker-compose docker-swarm docker-swarm-mode docker-cloud

我刚开始使用docker。我能够创建一个docker compose文件,该文件部署了我的应用程序的三个组件,并在一个主机中具有必要的复制数。 我想复制相同的东西,现在有多个主机。 我有三个过程A [7份],B [1份],C [1份] 我在docker网站上关注了创建swarm教程,并设法创建了一个管理器并将两个工作者连接到它。

所以现在当我运行我的命令

 docker stack deploy --compose-file docker-compose.yml perf

它确实产生了所需数量的机器,但它们都在管理器本身中。 理想情况下,我希望他们在经理中产生C和B,并且在工人1和工人2之间分配A的副本 这是我的docker -compose文件

version: '3'

services:

  A:
    image: A:host
    tty: true
    volumes:
      - LogFilesLocationFolder:/jmeter/log
      - AntOutLogFolder:/antout
      - ZipFilesLocationFolder:/zip
    deploy:
      replicas: 7
      placement:
        constraints: [node.role == worker]
    networks:
      - perfhost

  B:
    container_name: s1_perfSqlDB
    restart: always
    tty: true
    image: mysql:5.5
    environment:
      MYSQL_ROOT_PASSWORD: ''
    volumes:
      - mysql:/var/lib/mysql
    ports:  
      - "3306:3306"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
       - perfhost

  C:
    container_name: s1_scheduler
    image: C:host
    tty: true
    volumes:
      - LogFilesLocationFolder:/log
      - ZipFilesLocationFolder:/zip
      - AntOutLogFolder:/antout
    networks:
      - perfhost
    deploy:
      placement:
        constraints: [node.role == manager]
    ports:
      - "7000:7000"


networks:
  perfhost:

volumes:
     mysql:
     LogFilesLocationFolder:
     ZipFilesLocationFolder:
     AntOutLogFolder:

B)如果我确实这样做了,我如何使用卷在Conatiner for Service A和服务B的容器之间传输数据,因为它们位于不同的主机上

3 个答案:

答案 0 :(得分:1)

一些提示和答案:

  • 服务名称我不推荐大写字母。使用有效的DNS主机名(小写,除了 - 之外没有特殊字符。)。
  • 在群集中不支持container_name,不需要它。看起来像C:应该是scheduler等等。使服务名称简单,以便在虚拟网络上易于使用/记忆。
  • 单个撰写文件中的所有服务始终位于swarm中的同一个docker网络上(并且docker-compose用于本地开发),因此无需进行网络分配或列表。
  • 重启:群体中始终不需要。该设置未被使用,无论如何都是默认设置。如果您将它用于docker-compose,则很少需要它,因为您通常不希望在错误期间重新生成循环中的应用程序,这通常会导致CPU竞争状况。我建议把它关掉。
  • 卷使用"卷驱动程序"。默认值为local,就像普通的docker命令一样。如果您有共享存储,则可以使用store.docker.com中的卷驱动程序插件来确保共享存储连接到正确的节点。
  • 如果您仍然遇到有关工作人员/经理任务分配的问题,请将docker node ls以及docker service lsdocker node ps <managername>的输出提供给我们,以帮助我们进行问题排查。

答案 1 :(得分:0)

首先你应该跑步 docker node ls 并检查您的所有节点是否都可用。如果是,则应检查工人是否具有运行容器所需的图像。 我也会尝试使用每个节点的id来约束,你可以使用上一个命令看到id。

答案 2 :(得分:0)

docker stack deploy之前运行:

mkdir /srv/service/public
docker run --rm -v /srv/service/public:/srv/service/public my-container-with-data cp -R /var/www/app/public /srv/service/public

使用可怕的/srv/service/public作为容器中的体积。