使用隔离的网络扩展Docker容器

3

我正在使用 Docker Compose(版本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等也是如此。我知道这很奇怪,但任务是并行一些测试,它们必须完全隔离。

Isolated containers

您可能已经注意到,我尝试了一些方法(在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时,是否有办法隔离一组服务?
谢谢。
1个回答

2

好的,事实证明,在我苦思冥想几天并试图找到一个适当的开箱即用解决方案来解决问题之后,实现这一目标的可行方法(实际上是符合我的需求的方法)是执行以下操作:

I. 为将调用其他容器(在本例中为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"]

III. 最后,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 {} +

正如您所看到的,第一步创建的卷可用于从容器内部访问docker API。通过这种方式,我可以查询提到的信息并编辑配置以仅在相同的DOCKER_CONTAINER_NUMBER上调用。除此之外,需要注意的是,我扩展命令具有非常特定的要求:每个Jboss都具有相同数量的数据源,这意味着DOCKER_CONTAINER_NUMBER将始终匹配。

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

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