2017-08-24 31 views
0

我正在使用docker-compose(v 3.3),并且我有一组服务,如下所示。使用隔离网络缩放Docker容器

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 

的问题/问题是关系到我的时候我的规模集装箱的一种子网(顺便说一下,我没有使用群在这里)在这个意义上,这些服务隔离的可能性,jboss1只能请参阅mysql1和elasticsearch1。对于jboss2 - mysql2 - es2也是如此。我知道这很奇怪,但任务是并行化一些测试,并且它们必须完全隔离。

Isolated containers

正如你可能已经意识到,我已经尝试了一些方法定义一些网络(即在撰写评论),但如果我缩放容器,他们显然会在同一个网络 - 这意味着我可以从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时,是否有办法隔离一组服务?

感谢

回答

0

嗯,事实证明,几天后,我已经出敲打着我的大脑,试图寻找这个问题的适当出的现成的解决方案,可行的方法做到这一点(实际上,这符合我的需要的一个)在做以下操作:

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从搬运工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中创建的卷用于访问泊坞窗来自容器内的API。这样,我可以查询提到的信息并编辑配置,以调用相同的DOCKER_CONTAINER_NUMBER。除此之外,重要的是要提到我的扩展命令有一个非常具体的要求,即:每个Jboss将拥有相同数量的数据源,这意味着DOCKER_CONTAINER_NUMBER将永远匹配。

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