具有确定性端口绑定的Docker扩展


14

我想缩放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"

Docker文件

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个文件,等等)。有其他解决方案吗?


如果您使用像詹金斯这样的CI服务器,则可以轻松处理
LinPy

环境不是固定的。基本上,目标是根据需要在任意位置弹出它。我可以使用yml具有不同环境变量的上述模板来解决该问题,但是我对是否有任何方法可以使用它--scale来解决。
哈希

有什么理由阻止您使用Swarm模式?
eez0

您将如何利用群模式来创建具有顺序端口和确定性端口绑定的多个实例?
哈希

您要运行多个实例,当您发送请求时,它将转到可用实例之一。这是您想要的行为吗?
Keaz

Answers:


3

不,您目前无法(10/14/19)在docker-compose文件中确定端口选择的确定性。在Github问题#722#1247中要求此行为,但是这些问题在未实现问题的情况下已关闭。

如果您想像听起来那样半动态地缩放应用程序,则需要用另一种方法解决。您的.yml模板创意听起来像是最干净的解决方案IMO。

您确定需要确定端口吗?如果您使用像nginx这样的反向代理,该代理在一个主机端口上侦听并平衡所有docker容器之间的负载,那么这对您的用例有用吗?在docker容器中设置nginx负载均衡器非常简单。我建议您仔细研究一下,如果仍然需要确定性的方法来使调用者知道服务的端口,以便它可以将请求重复发送到特定服务器,则可以采用.yml模板解决方案或与服务发现过程不同的方法docker-compose配置。


感谢您提供的链接,我对它们甚至都没有解决问题感到失望...我想完全自动扩展。:)在容器启动之前,我需要确定性的端口来生成一些文件(每个端口应用于不同的用户,因此在负载平衡不是一种选择之前,我曾说过)。因此,您共享的信息更像是评论,而不是答案。
哈希

因此,在那种情况下,您实际上并不是以docker-compose和docker能够处理的方式“动态扩展”。他们期望服务的实例是完全可互换的,但就您而言,它们不是...您需要某种服务发现机制或确定性的端口分配,我认为您的.yml模板方法是最快,最简单的方法解。顺便说一句,我从技术上回答了您的问题“有没有办法使端口分配具有确定性?” :),但很抱歉,我无法提出更有用的解决方案。
布伦丹·戈金
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.