使用隔离网络扩展 Docker 个容器
Scaling Docker Containers with isolated networks
我正在使用 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
problem/question 与我在某种子网中扩展我的容器时隔离这些服务的可能性有关(顺便说一下,我在这里没有使用 swarm)[=38] =]只能看到mysql1和elasticsearch1。 jboss2 - mysql2 - es2 等也是如此。我知道这很奇怪,但任务是并行化一些测试,它们必须完全隔离。
正如您可能已经意识到的那样,我已经尝试了一些定义一些网络的方法(在撰写中有评论),但是如果我扩展容器,它们显然会在同一个网络上——这意味着我可以从 jboss-1 随机 ping mysql-n。
然后,我尝试了 Arun Gupta http://blog.arungupta.me/docker-bridge-overlay-network-compose-variable-substitution/ 在这里解释的另一种方法,他提到了网络属性中的变量替换(那里的 ${NETWORK})。但事实证明,如果我尝试通过 "up" 我的容器:
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
时有没有办法隔离一组服务?
谢谢
好吧,事实证明,几天后我一直在绞尽脑汁并试图为问题找到一个合适的开箱即用的解决方案,实现这一目标的可行方法(实际上,符合我需要的)正在执行以下操作:
我。为将调用其他容器的实例创建特定卷(在本例中,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
我正在使用 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
problem/question 与我在某种子网中扩展我的容器时隔离这些服务的可能性有关(顺便说一下,我在这里没有使用 swarm)[=38] =]只能看到mysql1和elasticsearch1。 jboss2 - mysql2 - es2 等也是如此。我知道这很奇怪,但任务是并行化一些测试,它们必须完全隔离。
正如您可能已经意识到的那样,我已经尝试了一些定义一些网络的方法(在撰写中有评论),但是如果我扩展容器,它们显然会在同一个网络上——这意味着我可以从 jboss-1 随机 ping mysql-n。
然后,我尝试了 Arun Gupta http://blog.arungupta.me/docker-bridge-overlay-network-compose-variable-substitution/ 在这里解释的另一种方法,他提到了网络属性中的变量替换(那里的 ${NETWORK})。但事实证明,如果我尝试通过 "up" 我的容器:
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
时有没有办法隔离一组服务?
谢谢
好吧,事实证明,几天后我一直在绞尽脑汁并试图为问题找到一个合适的开箱即用的解决方案,实现这一目标的可行方法(实际上,符合我需要的)正在执行以下操作:
我。为将调用其他容器的实例创建特定卷(在本例中,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