Échelle Docker avec liaison de port déterministe

14

Je souhaite mettre à l'échelle un wildflyconteneur ayant exposé plusieurs ports avec des résultats déterministes.

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

Commande pour démarrer

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

Cela fonctionne presque comme je le souhaite, mais il existe une certaine différence de port. Lorsque je crée les conteneurs, je veux qu'ils aient des ports incrémentiels pour chaque conteneur à exposer comme suit:

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

Mais ce que j'obtiens en conséquence n'est pas déterministe et ressemble à ceci:

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

Le problème est que chaque fois que j'exécute la commande compose up, les ports sont différents pour chaque conteneur.

Exemple de sortie:

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

Question

Existe-t-il un moyen de rendre la distribution des ports déterministe? Comme désactiver la course parallèle pour avoir des vérifications en série sur les ports disponibles ou toute autre méthode? La seule alternative que j'ai trouvée est d'avoir un yml modèle et de générer tous les fichiers nécessaires (comme 10 si j'ai besoin de 10 conteneurs, etc.). Existe-t-il des solutions alternatives?

Hacher
la source
si vous utilisez un serveur CI comme jenkins, vous pouvez le manipuler simplement
LinPy
L'environnement n'est pas fixe. L'objectif est essentiellement de le faire apparaître n'importe où autant d'instances que nécessaire. Je peux le résoudre avec le ymlmodèle mentionné avec différentes variables d'environnement, mais je suis intéressé s'il existe un moyen d'utiliser le --scalepour le faire.
Hash
y a-t-il une raison qui vous empêche d'utiliser le mode Swarm?
eez0
Comment utiliseriez-vous le mode Swarm pour créer plusieurs instances avec des ports séquentiels et avec une liaison de port déterministe?
Hash
Vous souhaitez exécuter plusieurs instances, lorsque vous envoyez une demande, elle ira à l'une des instances disponibles. Est-ce le comportement que vous souhaitez?
Keaz

Réponses:

3

Non, vous ne pouvez pas actuellement (14/10/19) rendre la sélection de port déterministe dans le fichier de composition de docker. Ce comportement a été demandé dans les problèmes Github # 722 et # 1247 , mais ces problèmes ont été résolus sans avoir été implémentés.

Si vous souhaitez mettre à l'échelle une application de manière semi-dynamique comme si cela vous ressemble, vous devrez résoudre ce problème d'une autre manière. Votre .ymlidée de modèle ressemble à la solution la plus propre de l'OMI.

Êtes-vous sûr de vouloir que les ports soient déterministes? Si vous utilisez un proxy inverse comme nginx qui écoute sur un port hôte et équilibre la charge entre tous vos conteneurs Docker, cela fonctionnerait-il pour votre cas d'utilisation? La configuration d'un équilibreur de charge Nginx dans un conteneur Docker est assez simple. Je vous suggère de vérifier cela, et si vous avez toujours besoin d'un moyen déterministe pour qu'un appelant connaisse le port du service afin qu'il puisse envoyer une demande à un serveur spécifique à plusieurs reprises, alors optez pour votre .ymlsolution de création de modèles ou une sorte de processus de découverte de service distinct de la configuration docker-compose.

Brendan Goggin
la source
Merci pour les liens, je suis un peu déçu qu'ils n'aient même pas résolu le problème ... Je veux évoluer de manière entièrement automatique. :) J'ai besoin de ports déterministes pour générer des fichiers avant que les conteneurs ne soient en place (chaque port devrait être pour un utilisateur différent, comme je l'ai dit avant que l'équilibrage de charge ne soit pas une option). Les informations que vous avez partagées ressemblent donc davantage à un commentaire qu'à une réponse.
Hash
Donc, dans ce cas, vous n'êtes pas vraiment "à l'échelle dynamique" d'une manière que docker-compose et docker sont équipés pour gérer. Ils s'attendent à ce que les instances de votre service soient entièrement interchangeables, et dans votre cas, elles ne le sont pas ... vous avez besoin d'une sorte de mécanisme de découverte de service ou d'une affectation déterministe des ports, et je pense que votre .ymlapproche de modélisation est la plus rapide, la plus simple Solution. Et btw, j'ai techniquement répondu à votre question "Y a-t-il un moyen de rendre la distribution des ports déterministe?" :) mais je m'excuse de ne pas avoir pu suggérer de solution plus utile.
Brendan Goggin