Мне нужно развернуть док-контейнер в рое. Я хочу развернуть 4 реплики док-контейнера. Я хочу установить порт, на котором будет работать каждый контейнер, и мне нужно знать их имя хоста.
То, что я хотел бы, это обедать 4 реплики.
Каждая реплика имеет один и тот же 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
но это не работает, как я хотел бы и как описано выше.
Надеюсь, описание проблемы понятно. Пожалуйста, дайте мне знать.
Я думаю, вы неправильно понимаете режим роя докеров, соответственно, как он должен работать. Режим 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
Но имейте в виду, что это уничтожает большую часть преимуществ роя.
Вы правы - разницы нет. docker service scale myservice=10
так же, как если бы вы использовали mode: replicated
и replicas: 10
. Оба просто влияют на количество запущенных контейнеров для каждой определенной службы.
Я понимаю ваше замечание и спасибо. Я читал статью о «масштабе службы докеров». Мне не ясно, в чем разница между этой командой и реплицированным режимом развертывания. Как вы думаете, может ли «масштабирование службы докеров» решить мою проблему?