【问题标题】:Scaling Docker Containers with isolated networks使用隔离网络扩展 Docker 容器
【发布时间】:2017-08-24 07:41:24
【问题描述】:

我正在使用 docker-compose (v 3.3),并且我有一组服务,如下所示。

version: '3.3'

services:
  jboss:
    build:
      context: .
      dockerfile: jboss/Dockerfile
    ports:
      - 8080
    depends_on:
      - mysql
      - elasticsearch
    networks:
      - ${NETWORK}
    #  - front-tier
    #  - back-tier

  mysql:
    hostname: mysql
    image: mysql:latest
    ports:
      - 3306
    networks:
      - ${NETWORK}
    #  - back-tier

  elasticsearch:
    image: elasticsearch:1.7.3
    ports:
      - 9200
    networks:
      - ${NETWORK}
    #  - back-tier

networks:

#  front-tier:
#   driver: bridge

问题/问题与当我在一种子网中扩展我的容器时隔离这些服务的可能性有关(顺便说一下,我在这里没有使用 swarm),因为 jboss1 只能看到 mysql1 和 elasticsearch1 . jboss2 - mysql2 - es2 等也是如此。我知道这很奇怪,但任务是并行化一些测试,它们必须完全隔离。

您可能已经意识到,我已经尝试了一些定义网络的方法(在 compose 中进行了注释),但是如果我扩展容器,它们显然会在同一个网络上 - 这意味着我可以随机从 jboss-1 ping mysql-n。

然后,我尝试了 Arun Gupta http://blog.arungupta.me/docker-bridge-overlay-network-compose-variable-substitution/ 在此解释的另一种方法,他提到了网络属性中的变量替换(对于那里的 ${NETWORK})。但事实证明,如果我尝试通过以下方式“提升”我的容器:

NETWORK=isolated-net1 docker-compose up -d

然后

NETWORK=isolated-net2 docker-compose up -d

它不会扩展容器,而是重新创建它们:

Recreating docker_mysql_1 ...
Recreating docker_elasticsearch_1 ...
Recreating docker_jboss_1 ...

简而言之:有没有办法在做docker-compose up --scale时隔离一组服务?

谢谢

【问题讨论】:

    标签: shell docker docker-compose docker-networking


    【解决方案1】:

    好吧,事实证明,经过几天我一直在绞尽脑汁并试图为问题找到一个合适的开箱即用解决方案,实现这一目标的可行方法(实际上,一个符合我需要的)正在执行以下操作:

    我。为将调用其他容器(在本例中为 JBoss)的实例创建特定卷:

    jboss:
        build:
          context: jboss
          dockerfile: Dockerfile
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        # ... omitting the rest
    

    二。使用真正进行隔离的脚本稍微编辑我的 Dockerfile:

    FROM my-private-jboss:latest
    ADD isolateNetwork.sh /opt/jboss/jboss-eap/jboss-as/server/default/bin/isolateNetwork.sh
    RUN chmod +x /opt/jboss/jboss-eap/jboss-as/server/default/bin/isolateNetwork.sh
    CMD ["/opt/jboss/jboss-eap/jboss-as/server/default/bin/isolateNetwork.sh"]
    

    三。最后,isolateNetwork.sh(警告:我必须在我的 JBoss 容器上安装 jq 以帮助从 docker API 中提取这些内容):

    #!/usr/bin/env bash
    
    curl -s --unix-socket /var/run/docker.sock http://localhost/containers/$(hostname)/json > container.json
    export DOCKER_CONTAINER_NUMBER=$(cat container.json | jq -r '.Config.Labels["com.docker.compose.container-number"]')
    export DOCKER_PROJECT_NAME=$(cat container.json | jq -r '.Config.Labels["com.docker.compose.project"]')
    
    export MYSQL_CONTAINER_NAME=${DOCKER_PROJECT_NAME}_mysql_${DOCKER_CONTAINER_NUMBER}
    export MYSQL_IP=$(curl -s --unix-socket /var/run/docker.sock http://localhost/containers/$MYSQL_CONTAINER_NAME/json | jq -r '.NetworkSettings.Networks[].IPAddress')
    
    #Now it's just required to edit the Datasources
    find . -iname "MySql*-ds.xml" -exec sed -i s/mysql:3306/${MYSQL_CONTAINER_NAME}:3306/g {} +
    

    如您所见,在第 1 步中创建的卷用于从容器内部访问 docker API。这样,我可以查询提到的信息并编辑配置以调用相同的DOCKER_CONTAINER_NUMBER。除此之外,值得一提的是,我的扩展命令有一个非常具体的要求:每个 Jboss 将拥有相同数量的数据源,这意味着 DOCKER_CONTAINER_NUMBER 将永远匹配。

    docker-compose up --scale jboss=%1 --scale elasticsearch=%1 --scale mysql=%1 --no-recreate -d
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2017-12-03
      • 2019-04-17
      相关资源
      最近更新 更多