缩放Docker容器与孤立的networking

我使用的是docker-compose(v3.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等等。 我知道这很奇怪,但是任务是并行化一些testing,它们必须完全隔离。

孤立的容器

正如你可能已经意识到的,我已经尝试了一些定义一些networking的方法(这些方法被评论),但是如果我扩展容器,他们显然将在同一个networking上 – 这意味着我可以随机ping mysql -n来自jboss-1。

然后,我尝试了Arun Gupta在这里解释的另一种方法http://blog.arungupta.me/docker-bridge-overlay-network-compose-variable-substitution/在那里他提到了networking属性中的variablesreplace(为此$那里有{NETWORK})。 但事实certificate,如果我尝试通过以下方式“boost”我的容器:

 NETWORK=isolated-net1 docker-compose up -d 

接着

 NETWORK=isolated-net2 docker-compose up -d 

它不会缩放容器,而是重新创build它们:

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

简而言之:在进行docker-compose up --scale时,是否有办法隔离一组服务?

谢谢

那么,事实certificate,在几天之后,我一直在殴打我的大脑,试图find一个适当的开箱即用的解决scheme,实现这一目标的可行方法(实际上,我的需要)正在做以下工作:

I.为将调用其他容器(在本例中为JBoss)的实例创build特定的卷:

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

II。 使用一个真正隔离的脚本稍微编辑我的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 -is/mysql:3306/${MYSQL_CONTAINER_NAME}:3306/g {} + 

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

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