Я новичок в docker swarm и хочу понять, как работает docker stack deploy.
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
redis:
image: "redis:alpine"
Когда я запускаю эту команду, она отлично работает
$ docker stack deploy -c docker-compose.yml mystack
Creating network mystack_default
Creating service mystack_web
Creating service mystack_redis
Чтобы проверить это
$ docker stack ps mystack
ID NAME IMAGE NODE
DESIRED STATE CURRENT STATE ERROR PORTS
rcci590y5c6o mystack_redis.1 redis:alpine
plakhera1.example.com Running Running 9 seconds ago
lty84a77b4my mystack_web.1 nginx:latest
plakhera2.mylabserver.com Running Running 2 seconds ago
Теперь у меня вопрос, как быть уверенным, что каждый раз, когда я развертываю это приложение / сервис, Redis будет появляться на plakhera1.example.com, а nginx - на plakhera2.example.com. Я считаю, что в настоящее время он выбирает узлы случайным образом, поэтому как я могу убедиться, что он всегда выбирает только эти узлы.
Обновление: мой веб-сценарий является основным приложением, но Redis выполняет много тяжелой работы, поэтому я всегда хочу, чтобы Redis был на мощном узле, есть ли способ указать через развертывание стека докеров, что веб всегда загружается на node1 и Redis на node2
Я думаю, что самый быстрый способ сделать это - установить node.hostname
ограничение размещения в службе. Обратите внимание: я тестировал это только с помощью compose v3.7
на Docker version 19.03.2
:
version: '3.7'
services:
redis:
image: "redis:alpine"
deploy:
# replicas: 3
placement:
constraints:
- node.hostname == plakhera1.example.com
Отметьте, если вы раскомментируете replicas
(что вы могли бы сделать в случае рабочих узлов или чего-то еще) все реплики должны быть развернуты на указанном узле.
Проверить вручную с помощью:
docker stack ps mystack
Недостатком этого является необходимость указывать фактическое имя хоста в файле создания. Я заметил, что вы также можете маркировать узлы и установить места размещения на основе этих ярлыков однако я обнаружил, что документация здесь немного скудная, и при быстром тестировании он вел себя не так, как ожидалось, но это мог быть просто я в спешке.