Развертывание реплик на определенных портах и ​​имени хоста

Мне нужно развернуть док-контейнер в рое. Я хочу развернуть 4 реплики док-контейнера. Я хочу установить порт, на котором будет работать каждый контейнер, и мне нужно знать их имя хоста.

То, что я хотел бы, это обедать 4 реплики.

  • Реплика 1 должна прослушивать порт 3001 и имя хоста slave1.
  • Реплика 2 должна прослушивать порт 3002 и имя хоста slave2.
  • Реплика 3 должна прослушивать порт 3003 и имя хоста slave3.
  • Реплика 4 должна прослушивать порт 3004 и имя хоста slave4.

Каждая реплика имеет один и тот же Dockerfile (потому что процесс, который я хочу запустить, одинаков). В Dockerfile я открываю все 4 порта с помощью стандартной команды: ЭКСПОЗИЦИЯ 3001 3002 3003 3004

Я попробовал этот файл для создания докеров, в котором я использую 4 порта и развертываю с использованием «режима: репликация».

services:
  slave:
    image: "DOCKER_REPO_NAME"
    deploy:
      mode: replicated
      replicas: 4
      restart_policy: 
        condition: on-failure
    networks:
      - my_net
    ports:
      - "3001:3001"
      - "3002:3002"
      - "3003:3003"
      - "3004:3004"

networks:
  my_net:
    external: true 

но это не работает, как я хотел бы и как описано выше.

Надеюсь, описание проблемы понятно. Пожалуйста, дайте мне знать.

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
0
4 521
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы неправильно понимаете режим роя докеров, соответственно, как он должен работать. Режим Swarm не работает на уровне контейнера/узла, но на один уровень абстракции выше — он работает с сервисами.

Служба состоит из заданного количества экземпляров контейнеров, работающих на заданном количестве узлов. Swarm будет обрабатывать, сколько экземпляров контейнеров запущено в рое, и он будет обрабатывать, на каких узлах работают контейнеры службы (конечно, вы можете настроить это, используя такие параметры, как replicas и constraints).

Большим преимуществом режима роя является то, что вам не нужно ничего знать об инфраструктуре роя. Вам все равно, какие узлы есть и какой контейнер работает на каком узле.

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

Итак, в вашем примере, если ваша служба работает на порту 3001 и, скажем, есть конечная точка API с именем GET /hello, вы должны запросить http://раб:3001/привет. Именно здесь вступает в игру режим роя, и поскольку он знает, какие контейнеры работают на каких узлах, он решит, куда будет перенаправлен ваш запрос.

Если вы хотите, чтобы определенные контейнеры прослушивали определенные порты на определенных узлах, вам нужно определить несколько служб и настроить их с помощью ограничения и метки.., чтобы ваш docker-compose.yml выглядел примерно так:

services:
  slave1:
    image: "DOCKER_REPO_NAME"
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.labels.type == slave1
      restart_policy: 
        condition: on-failure
    networks:
      - my_net
    ports:
      - "3001:3001"
  slave2:
    image: "DOCKER_REPO_NAME"
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.labels.type == slave2
      restart_policy: 
        condition: on-failure
    networks:
      - my_net
    ports:
      - "3002:3001"
  slave3:
    image: "DOCKER_REPO_NAME"
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.labels.type == slave3
      restart_policy: 
        condition: on-failure
    networks:
      - my_net
    ports:
      - "3003:3001"
  slave4:
    image: "DOCKER_REPO_NAME"
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.labels.type == slave4
      restart_policy: 
        condition: on-failure
    networks:
      - my_net
    ports:
      - "3004:3001"

networks:
  my_net:
    external: true 

Но имейте в виду, что это уничтожает большую часть преимуществ роя.

Я понимаю ваше замечание и спасибо. Я читал статью о «масштабе службы докеров». Мне не ясно, в чем разница между этой командой и реплицированным режимом развертывания. Как вы думаете, может ли «масштабирование службы докеров» решить мою проблему?

dventi3 09.04.2019 15:51

Вы правы - разницы нет. docker service scale myservice=10 так же, как если бы вы использовали mode: replicated и replicas: 10. Оба просто влияют на количество запущенных контейнеров для каждой определенной службы.

codinghaus 11.04.2019 16:58

Другие вопросы по теме