Chciałbym skalować wildfly
kontener, 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?
źródło
yml
szablonu z różnymi zmiennymi środowiskowymi, ale jestem zainteresowany, czy istnieje jakiś sposób, aby--scale
to zrobić.Odpowiedzi:
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
.yml
pomysł 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
.yml
rozwiązania szablonowego lub jakiegoś rodzaju procesu wykrywania usługi oddzielnego od konfiguracja dokera-komponowania.źródło
.yml
szablonowe 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.