Scala Docker con rilegatura delle porte deterministica


14

Vorrei ridimensionare un wildflycontenitore che ha esposto più porte con risultati deterministici.

finestra mobile-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 per iniziare

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

Funziona quasi come voglio, ma c'è qualche discrepanza nelle porte. Quando creo i contenitori, desidero che abbiano porte incrementali per ogni contenitore da esporre come segue:

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

Ma quello che ottengo di conseguenza non è deterministico e si presenta così:

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

Il problema è che ogni volta che eseguo il comando compose up, le porte sono diverse per ciascun contenitore.

Esempio di output:

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

Domanda

Esiste un modo per rendere deterministica la distribuzione delle porte? Come disabilitare la corsa parallela per avere controlli seriali sulle porte disponibili o qualsiasi altro metodo? L'unica alternativa che ho trovato è avere un yml modello e generare tutti i file necessari (come 10 se ho bisogno di 10 contenitori ecc.). Ci sono soluzioni alternative?


se usi un server CI come jenkins puoi
gestirlo

L'ambiente non è fisso. L'obiettivo è fondamentalmente far apparire ovunque tutte le istanze necessarie. Posso risolverlo con il ymlmodello menzionato con diverse variabili d'ambiente, ma sono interessato se esiste un modo per usarlo --scale.
Hash

c'è qualche motivo che ti impedisce di utilizzare la modalità Sciame?
eez0

Come utilizzeresti la modalità sciame per creare più istanze con porte sequenziali e con associazione delle porte deterministica?
Hash

Si desidera eseguire più istanze, quando si invia una richiesta, andrà a una delle istanze disponibili. È questo il comportamento che desideri?
Keaz,

Risposte:


3

No, attualmente non è possibile (14/10/19) rendere deterministica la selezione della porta nel file di composizione docker. Questo comportamento è stato richiesto nei numeri 722 e 1247 di Github , ma tali problemi sono stati chiusi senza che il problema fosse stato implementato.

Se vuoi ridimensionare in modo semi-dinamico un'applicazione come sembra, allora dovrai risolverlo in un altro modo. La tua .ymlidea di modello suona come la soluzione IMO più pulita.

Sei sicuro di aver bisogno che le porte siano deterministiche? Se si utilizza un proxy inverso come nginx che è in ascolto su una porta host e bilancia il carico tra tutti i contenitori della finestra mobile, funzionerebbe per il caso d'uso? L'impostazione di un bilanciamento del carico nginx in un contenitore docker è piuttosto semplice. Ti suggerisco di esaminarlo e, se hai ancora bisogno di un modo deterministico per un chiamante di conoscere la porta del servizio in modo che possa inviare ripetutamente una richiesta a un server specifico, quindi vai con la tua .ymlsoluzione di modello o un qualche tipo di processo di individuazione del servizio separato da la configurazione docker-compose.


Grazie per i collegamenti, sono un po 'deluso dal fatto che non abbiano nemmeno affrontato il problema ... Voglio ridimensionare in modo completamente automatico. :) Ho bisogno di porte deterministiche per generare alcuni file prima che i container siano attivi (ogni porta dovrebbe essere per un utente diverso, quindi come ho commentato prima che il bilanciamento del carico non sia un'opzione). Quindi le informazioni che hai condiviso sono più simili a un commento, non a una risposta.
Hash

Quindi, in tal caso, non si sta realmente "ridimensionando dinamicamente" in un modo che la docker-compose e la docker sono attrezzate per gestire. Si aspettano che le istanze del tuo servizio siano completamente intercambiabili, e nel tuo caso non lo sono ... o hai bisogno di un qualche tipo di meccanismo di rilevazione del servizio o di assegnazione deterministica delle porte, e penso che il tuo .ymlapproccio al modello sia il più veloce, il più semplice soluzione. E a proposito, ho tecnicamente risposto alla tua domanda "Esiste un modo per rendere deterministica la distribuzione delle porte?" :) ma mi scuso per non aver potuto suggerire una soluzione più utile.
Brendan Goggin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.