Escala Docker con enlace de puerto determinista

14

Me gustaría escalar un wildflycontenedor que haya expuesto múltiples puertos con resultados deterministas.

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}/

Comando para comenzar

docker-compose up --build --force-recreate --scale wildfly-server=10

Casi funciona como quiero, pero hay cierta discrepancia de puertos. Cuando creo los contenedores, quiero que tengan puertos incrementales para que cada contenedor quede expuesto de la siguiente manera:

machine_1 8001, 8101, 82001
machine_2 8002, 8102, 82002
machine_3 8003, 8103, 82003 

Pero lo que obtengo como resultado no es determinista y se ve así:

machine_1 8001, 8102, 82003
machine_2 8002, 8101, 82001
machine_3 8003, 8103, 82002 

El problema es que cada vez que ejecuto el comando componer, los puertos son diferentes para cada contenedor.

Salida de ejemplo:

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

Pregunta

¿Hay alguna forma de hacer que la distribución del puerto sea determinista? ¿Como deshabilitar la ejecución en paralelo para tener verificaciones en serie en los puertos disponibles o cualquier otro método? La única alternativa que encontré es tener una yml plantilla y generar todos los archivos necesarios (como 10 si necesito 10 contenedores, etc.). ¿Hay alguna solución alternativa?

Picadillo
fuente
si usa un servidor CI como jenkins, puede
hacerlo
El entorno no es fijo. El objetivo es básicamente abrirlo en cualquier lugar tantas instancias como sea necesario. Puedo resolverlo con la ymlplantilla mencionada con diferentes variables de entorno, pero estoy interesado si hay alguna forma de usarlo --scalepara hacerlo.
Hash
¿Hay alguna razón que te impida usar el modo Enjambre?
eez0
¿Cómo utilizaría el modo enjambre para crear múltiples instancias con puertos secuenciales y con enlace de puerto determinista?
Hash
Desea ejecutar varias instancias, cuando envíe una solicitud, irá a una de las instancias disponibles. ¿Es este el comportamiento que quieres?
Keaz el

Respuestas:

3

No, actualmente no puede (14/10/19) hacer que la selección del puerto sea determinista en el archivo docker-compose. Este comportamiento se solicitó en los problemas # 722 y # 1247 de Github , pero esos problemas se cerraron sin que el problema se haya implementado.

Si desea escalar semi-dinámicamente una aplicación como suena, entonces deberá resolver esto de otra manera. Su .ymlidea de plantilla suena como la solución más limpia de la OMI.

¿Estás seguro de que necesitas que los puertos sean deterministas? Si utiliza un proxy inverso como nginx que escucha en un puerto de host y equilibra la carga entre todos sus contenedores acoplables, ¿funcionaría para su caso de uso? Configurar un equilibrador de carga nginx en un contenedor acoplable es bastante sencillo. Le sugiero que investigue eso, y si aún necesita una forma determinista para que una persona que llama conozca el puerto del servicio para que pueda enviar una solicitud a un servidor específico repetidamente, luego vaya con su .ymlsolución de plantillas o algún tipo de proceso de descubrimiento de servicios separado de la configuración docker-compose.

Brendan Goggin
fuente
Gracias por los enlaces, estoy un poco decepcionado de que ni siquiera hayan solucionado el problema ... Quiero escalar de forma totalmente automática. :) Necesito puertos deterministas para generar algunos archivos antes de que los contenedores estén activos (cada puerto debe ser para un usuario diferente, así como comenté antes, el equilibrio de carga no es una opción). Entonces, la información que ha compartido es más como un comentario, no una respuesta.
Hash
Entonces, en ese caso, no estás realmente "escalando dinámicamente" de una manera que docker-compose y docker están equipados para manejar. Esperan que las instancias de su servicio sean totalmente intercambiables, y en su caso no lo son ... o necesita algún tipo de mecanismo de descubrimiento de servicio o asignación determinista de puertos, y creo que su .ymlenfoque de plantilla es el más rápido y fácil solución. Y por cierto, técnicamente respondí tu pregunta de "¿Hay alguna forma de hacer que la distribución del puerto sea determinista?" :) pero me disculpo por no poder sugerir una solución más útil.
Brendan Goggin