Me gustaría escalar un wildfly
contenedor 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?
fuente
yml
plantilla mencionada con diferentes variables de entorno, pero estoy interesado si hay alguna forma de usarlo--scale
para hacerlo.Respuestas:
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
.yml
idea 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
.yml
solución de plantillas o algún tipo de proceso de descubrimiento de servicios separado de la configuración docker-compose.fuente
.yml
enfoque 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.