Шкала Docker с детерминированной привязкой порта - PullRequest
14 голосов
/ 06 октября 2019

Я бы хотел масштабировать контейнер 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"

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

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

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 

Проблема в том, что каждый раз, когда я запускаю команду compose up, порты различны для каждого контейнера.

Пример вывода:

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 контейнеров и т. Д.). Есть ли альтернативные решения?

1 Ответ

3 голосов
/ 14 октября 2019

Нет, в настоящее время (14.10.19) вы не можете сделать выбор порта детерминированным в файле docker-compose. Такое поведение было запрошено в Github-проблемах # 722 и # 1247 , но эти проблемы были закрыты, но проблема не была реализована.

Если вы хотите полудинамическимасштабируйте приложение так, как оно звучит, как вы, тогда вам нужно решить эту проблему другим способом. Ваша .yml шаблонная идея звучит как самое чистое решение IMO.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...