Развертывание реплик в определенных портах и ​​имени хоста - PullRequest
0 голосов
/ 09 апреля 2019

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

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

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

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

Я попробовал этот файл docker-compose, где я использую 4 порта и развертываю, используя "mode: replicated"

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 

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

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

1 Ответ

0 голосов
/ 09 апреля 2019

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

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

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

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

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

Если вы хотите, чтобы определенные контейнеры прослушивали определенные порты на определенных узлах, вы должны определить несколько служби настройте их, используя ограничения и метки .. так, чтобы ваш 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 

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

...