Skala dokowania z deterministycznym wiązaniem portów

14

Chciałbym skalować wildflykontener, który odsłonił wiele portów z deterministycznymi wynikami.

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"

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

Polecenie, aby rozpocząć

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

Działa prawie tak, jak chcę, ale istnieje pewna rozbieżność portów. Kiedy tworzę kontenery, chcę, aby miały one przyrostowe porty dla każdego kontenera, które mają być widoczne:

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

Ale to, co otrzymuję, nie jest deterministyczne i wygląda następująco:

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

Problem polega na tym, że za każdym razem, gdy uruchamiam polecenie komponowania, porty są różne dla każdego kontenera.

Przykładowe dane wyjściowe:

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

Pytanie

Czy jest jakiś sposób, aby deterministyczny rozkład portów? Jak wyłączyć równoległe uruchamianie, aby mieć kontrolę szeregów dostępnych portów lub inną metodę? Jedyną alternatywą, jaką znalazłem, jest posiadanie yml szablonu i generowanie wszystkich niezbędnych plików (np. 10, jeśli potrzebuję 10 kontenerów itp.). Czy są jakieś alternatywne rozwiązania?

Haszysz
źródło
jeśli używasz serwera CI jak jenkins, możesz po prostu
handlować
Środowisko nie jest stałe. Celem jest w zasadzie wyskakowanie w dowolną liczbę instancji w razie potrzeby. Mogę go rozwiązać za pomocą wspomnianego ymlszablonu z różnymi zmiennymi środowiskowymi, ale jestem zainteresowany, czy istnieje jakiś sposób, aby --scaleto zrobić.
Hash
czy jest jakiś powód uniemożliwiający korzystanie z trybu roju?
eez0
Jak wykorzystałbyś tryb roju do tworzenia wielu instancji z sekwencyjnymi portami i deterministycznym wiązaniem portów?
Hash
Chcesz uruchomić wiele instancji, kiedy wyślesz żądanie, trafi ono do jednej z dostępnych instancji. Czy takie zachowanie chcesz?
Keaz

Odpowiedzi:

3

Nie, obecnie (10/14/19) nie można dokonać deterministycznego wyboru portu w pliku skomponowania dokera. To zachowanie było wymagane w numerach Github nr 722 i nr 1247 , ale problemy te zostały zamknięte bez problemu.

Jeśli chcesz pół-dynamicznie skalować aplikację tak, jakby to brzmiało, musisz rozwiązać ten problem w inny sposób. Twój .ymlpomysł na szablon brzmi jak najczystsze rozwiązanie IMO.

Czy na pewno potrzebujesz deterministycznych portów? Jeśli użyjesz odwrotnego proxy, takiego jak nginx, który nasłuchuje na jednym porcie hosta i równoważy obciążenie między wszystkimi kontenerami dokerów, czy to zadziała w twoim przypadku użycia? Konfigurowanie modułu równoważenia obciążenia nginx w kontenerze dokowanym jest dość proste. Sugeruję, abyś się tym zajął i jeśli nadal potrzebujesz deterministycznego sposobu, aby osoba dzwoniąca znała port usługi, aby mogła wielokrotnie wysyłać żądanie do określonego serwera, a następnie skorzystaj z .ymlrozwiązania szablonowego lub jakiegoś rodzaju procesu wykrywania usługi oddzielnego od konfiguracja dokera-komponowania.

Brendan Goggin
źródło
Dziękuję za linki, jestem trochę rozczarowany, że nawet nie rozwiązały problemu ... Chcę skalować w pełni automatycznie. :) Potrzebuję deterministycznych portów, aby wygenerować niektóre pliki przed uruchomieniem kontenerów (każdy port powinien być dla innego użytkownika, tak jak skomentowałem, zanim równoważenie obciążenia nie jest opcją). Udostępnione informacje są więc raczej komentarzem, a nie odpowiedzią.
Hash
W takim przypadku nie jest tak naprawdę „dynamicznie skalowane” w sposób, w jaki dokerowanie-komponowanie i doker są przystosowane do obsługi. Oczekują, że instancje Twojej usługi będą w pełni zamienne, a w Twoim przypadku nie są ... albo potrzebujesz jakiegoś mechanizmu wykrywania usług lub deterministycznego przypisania portów, i myślę, że twoje .ymlszablonowe podejście jest najszybsze, najłatwiejsze rozwiązanie. A tak przy okazji, technicznie odpowiedziałem na twoje pytanie: „Czy jest jakiś sposób, aby podział portów był deterministyczny?” :) ale przepraszam, że nie mogłem zaproponować bardziej pomocnego rozwiązania.
Brendan Goggin