Я думаю, вы неправильно понимаете режим роя 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
Но помните о том, что это разрушает большую часть преимуществроя.