具有确定性端口绑定的Docker规模

具有确定性端口绑定的Docker规模,docker,docker-compose,Docker,Docker Compose,我想扩展一个wildfly容器,该容器公开了多个具有确定性结果的端口 docker compose.yml version: '3' services: wildfly-server: build: context: . dockerfile: Dockerfile args: admin_user: admin admin_password: admin deploy: resources:

我想扩展一个
wildfly
容器,该容器公开了多个具有确定性结果的端口

docker compose.yml

version: '3'
services:
  wildfly-server:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        admin_user: admin
        admin_password: admin
    deploy:
      resources:
          limits:
            memory: 1.5G
            cpus: "1.5"
    restart: always
    ports:
      - "8000-8099:8080"
      - "8100-8199:9990"
      - "8200-8299:8787"
    expose:
      - "8080"
      - "9990"
      - "8787"
Dockerfile

FROM jboss/wildfly:16.0.0.Final

# DOCKER ENV VARIABLES
ENV WILDFLY_HOME /opt/jboss/wildfly
ENV STANDALONE_DIR ${WILDFLY_HOME}/standalone
ENV DEPLOYMENT_DIR ${STANDALONE_DIR}/deployments
ENV CONFIGURATION_DIR ${STANDALONE_DIR}/configuration

RUN ${WILDFLY_HOME}/bin/add-user.sh ${admin_user} ${admin_password} --silent

# OPENING DEBUG PORT
RUN rm ${WILDFLY_HOME}/bin/standalone.conf
ADD standalone.conf ${WILDFLY_HOME}/bin/

# SET JAVA ENV VARS
RUN rm ${CONFIGURATION_DIR}/standalone.xml
ADD standalone.xml ${CONFIGURATION_DIR}/
启动命令

docker-compose up --build --force-recreate --scale wildfly-server=10
它几乎像我想的那样工作,但存在一些端口差异。创建容器时,我希望每个容器都有增量端口,如下所示:

machine_1 8001, 8101, 82001
machine_2 8002, 8102, 82002
machine_3 8003, 8103, 82003 
但是我得到的结果是不确定的,看起来是这样的:

machine_1 8001, 8102, 82003
machine_2 8002, 8101, 82001
machine_3 8003, 8103, 82002 
问题是每次运行compose up命令时,每个容器的端口都不同

示例输出:

CONTAINER ID  COMMAND                  CREATED             STATUS              PORTS                                                                    NAMES
0232f24fbca4  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8028->8080/tcp, 0.0.0.0:8231->8787/tcp, 0.0.0.0:8126->9990/tcp   wildfly-server_7
13a6a365a552  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8031->8080/tcp, 0.0.0.0:8230->8787/tcp, 0.0.0.0:8131->9990/tcp   wildfly-server_10
bf8260d9874d  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8029->8080/tcp, 0.0.0.0:8228->8787/tcp, 0.0.0.0:8129->9990/tcp   wildfly-server_6
3d58f2e9bdfe  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8030->8080/tcp, 0.0.0.0:8229->8787/tcp, 0.0.0.0:8130->9990/tcp   wildfly-server_9
7824a73a09f5  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8027->8080/tcp, 0.0.0.0:8227->8787/tcp, 0.0.0.0:8128->9990/tcp   wildfly-server_3
85425462259d  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8024->8080/tcp, 0.0.0.0:8224->8787/tcp, 0.0.0.0:8124->9990/tcp   wildfly-server_2
5be5bbe8e577  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8026->8080/tcp, 0.0.0.0:8226->8787/tcp, 0.0.0.0:8127->9990/tcp   wildfly-server_8
2512fc0643a3  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8023->8080/tcp, 0.0.0.0:8223->8787/tcp, 0.0.0.0:8123->9990/tcp   wildfly-server_5
b156de688dcb  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8025->8080/tcp, 0.0.0.0:8225->8787/tcp, 0.0.0.0:8125->9990/tcp   wildfly-server_4
3e9401552b0a  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8022->8080/tcp, 0.0.0.0:8222->8787/tcp, 0.0.0.0:8122->9990/tcp   wildfly-server_1
问题

有没有办法使端口分布具有确定性?例如禁用并行运行以对可用端口进行串行检查或任何其他方法?我找到的唯一替代方法是使用
yml
模板,并生成所有必要的文件(如10个,如果我需要10个容器等)。是否有其他解决方案?

否,当前(10/14/19)无法在docker compose文件中确定端口选择。此行为是在Github问题和中请求的,但这些问题在未实现该问题的情况下已解决

如果您想半动态地扩展一个应用程序,就像您听起来那样,那么您需要用另一种方法来解决这个问题。你的
.yml
模板化想法听起来像是最干净的解决方案


您确定需要端口具有确定性吗?如果您使用像nginx这样的反向代理,它侦听一个主机端口并平衡所有docker容器之间的负载,那么这对您的用例是否有效?在docker容器中设置nginx负载平衡器非常简单。我建议您研究一下,如果您仍然需要一种确定性的方法让调用方知道服务的端口,以便它可以重复向特定服务器发送请求,然后使用您的
.yml
模板化解决方案或某种与docker compose配置分离的服务发现过程。

您可以使用变量替换来完成此操作:

yaml:
...
   ports:
      ${PORT}:8080
然后使用特定端口调用docker:

for p in {8000..8099}; do
   PORT=$p docker-compose ...
done


如果您使用像jenkins这样的CI服务器,您可以简单地说环境不是一个固定的环境。目标基本上是根据需要在任意位置弹出它。我可以用前面提到的带有不同环境变量的
yml
模板来解决它,但我感兴趣的是,是否有任何方法可以使用
--scale
来实现这一点。是否有任何理由阻止您使用Swarm模式?您将如何利用Swarm模式创建具有顺序端口和确定性端口绑定的多个实例?您想运行多个实例,当您发送请求时,它将转到一个可用实例。这是你想要的行为吗?谢谢你的链接,我有点失望,他们甚至没有解决这个问题。。。我想完全自动缩放。:)在容器启动之前,我需要确定性端口来生成一些文件(每个端口应该针对不同的用户,正如我在负载平衡不是选项之前所评论的)。因此,您共享的信息更像是一条评论,而不是一个答案。因此,在这种情况下,您并不是真正以docker compose和docker能够处理的方式“动态缩放”。他们希望您的服务实例可以完全互换,而在您的情况下,它们不是。。。您要么需要某种服务发现机制,要么需要确定的端口分配,我认为您的
.yml
模板化方法是最快速、最简单的解决方案。顺便说一句,我从技术上回答了您的问题“有没有办法使端口分布具有确定性?”:)但很抱歉,我无法提出一个更有用的解决方案。与问题中提到的yaml模板生成相比,这并不是一个真正不同的解决方案,但可能是一个替代方案。谢谢你的主意。