Назад | Перейти на главную страницу

Как работает развертывание стека докеров?

Я новичок в 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

Недостатком этого является необходимость указывать фактическое имя хоста в файле создания. Я заметил, что вы также можете маркировать узлы и установить места размещения на основе этих ярлыков однако я обнаружил, что документация здесь немного скудная, и при быстром тестировании он вел себя не так, как ожидалось, но это мог быть просто я в спешке.