Докерська шкала з детермінованим прив'язкою портів


14

Я хотів би масштабувати wildflyконтейнер, виставивши кілька портів з детермінованими результатами.

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"

Докерфайл

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

Команда для запуску

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

Це майже працює як я хочу, але є певна розбіжність у порту. Коли я створюю контейнери, я хочу, щоб вони мали додаткові порти для кожного контейнера, який підлягав би експозиції, як описано нижче:

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

Але те, що я отримую в результаті, не є детермінованим і виглядає приблизно так:

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

Проблема полягає в тому, що щоразу, коли я запускаю команду складання, порти відрізняються для кожного контейнера.

Приклад виводу:

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

Питання

Чи є спосіб зробити розподіл портів детермінованим? Як відключити паралельне виконання, щоб мати послідовну перевірку наявних портів чи будь-який інший метод? Єдина альтернатива, яку я знайшов, - це створити yml шаблон і генерувати всі необхідні файли (наприклад, 10, якщо мені потрібно 10 контейнерів тощо). Чи є альтернативні рішення?


якщо ви використовуєте сервер CI, як jenkins, ви можете це просто
провести

Навколишнє середовище не є фіксованим. Мета полягає в тому, щоб спливати його де завгодно стільки екземплярів, скільки потрібно. Я можу вирішити це за допомогою згаданого ymlшаблону з різними змінними середовища, але мені цікаво, чи є спосіб використовувати --scaleце.
Хеш

чи є якась причина, яка заважає вам використовувати режим Swarm?
eez0

Як би ви використовували режим рій для створення декількох примірників із послідовними портами та з детермінованим прив’язкою до порту?
Хеш

Ви хочете запустити кілька екземплярів, коли ви надсилаєте запит, він перейде до одного з доступних екземплярів. Це та поведінка, яку ви хочете?
Keaz

Відповіді:


3

Ні, наразі ви не можете (14.10.199) зробити вибір порту детермінованим у файлі докер-композиції. Таку поведінку вимагали у випусках Github №722 та №1247 , однак ці проблеми були закриті, без виправлення проблеми .

Якщо ви хочете напівдинамічно масштабувати додаток так, як це звучить, як ви, тоді вам потрібно буде вирішити інший спосіб. Ваша .ymlшаблонна ідея звучить як найчистіше рішення ІМО.

Ви впевнені, що вам потрібні детерміністичні порти? Якщо ви використовуєте зворотний проксі-сервер, наприклад nginx, який слухає на одному порту хоста і врівноважує навантаження між усіма вашими контейнерами докера, чи буде це працювати для вашого випадку використання? Налаштування балансира навантаження nginx у контейнері docker досить просто. Я пропоную розібратися в цьому, і якщо вам все-таки потрібен детермінований спосіб, щоб абонент знав порт сервісу, щоб він міг повторно надсилати запит на певний сервер, тоді перейдіть із .ymlрішенням шаблону чи яким-небудь процесом виявлення послуги окремо від конфігурація докер-композиції.


Дякую за посилання, я трохи розчарований, що вони навіть не вирішили проблему ... Я хочу масштабувати повністю автоматично. :) Мені потрібні детерміновані порти, щоб генерувати деякі файли до того, як контейнери будуть створені (кожен порт повинен бути для іншого користувача, так як я коментував перед балансуванням завантаження - це не варіант). Тож інформація, якою ви поділилися, більше нагадує коментар, а не відповідь.
Хеш

Тож у такому випадку ви насправді не «динамічно масштабуєте» таким чином, щоб докер-композитор та докер були оснащені для обробки. Вони очікують, що екземпляри вашої служби будуть повністю взаємозамінними, а у вашому випадку вони не є ... вам або потрібен якийсь механізм виявлення служби або детерміноване призначення портів, і я думаю, що ваш .ymlшаблоновий підхід є найшвидшим, найпростішим рішення. І btw, я технічно відповів на ваше запитання "Чи є спосіб зробити розподіл портів детермінованим?" :) але вибачаюсь, що не міг запропонувати більш корисного рішення.
Брендан Гоггін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.