Добавление службы в стек после развертывания стека

Я пытаюсь добавить службу в стек после того, как стек уже развернут. Но у этой новой службы возникают проблемы со связью со службами (redis) внутри стека.

Это мое текущее понимание стеков и услуг, пожалуйста, дайте мне знать, если есть какие-либо неточности.

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

Я хотел бы сначала развернуть стек в Swarm (через файл compose), а затем периодически добавлять контейнеры, подобные описанному в этой статье, о контейнерах одноразового использования. Эти контейнеры отличаются тем, что выполняют длинные операции с состоянием. Их нужно обрести в каком-то начальном состоянии, выполнить свою работу и затем уйти. Они разные, потому что их не нужно тиражировать или балансировать нагрузку.

По сути, я пытаюсь сделать следующее:

Запустите "стек", как это:

docker stack deploy --with-registry-auth --compose-file docker-compose.yml my-stack

А потом, через некоторое время, когда будут выполнены определенные критерии, добавьте контейнер, подобный этому:

docker service create -name statefulservice reponame/imagename

И это обычно ведет себя как ожидалось, за исключением того, что statefulservice не может общаться с redis внутри my-stack.

Я уверен, что statefulservice спроектирован правильно, потому что когда он добавляется в docker-compose.yml, он ведет себя как ожидалось.

Еще одна деталь, которая может иметь или не иметь значение, состоит в том, что команда для создания новой службы выдается из контейнера в рое. Это происходит с помощью go sdk для докера, и я использую его так, как описано в статье об одном контейнере

Причина, по которой я подозреваю, что это не имеет значения: я все еще сталкиваюсь с этой проблемой, когда я делаю эту операцию только через docker-cli (и не использую docker sdk для go).

2 ответа

Решение

При развертывании стека, как это:

docker stack deploy --with-registry-auth --compose-file docker-compose.yml my-stack

Это создает сеть под названием my-stack_default

Таким образом, чтобы запустить сервис, который может общаться с сервисами, которые в этом stack вам нужно запустить их так:

docker service create -name statefulservice --network my-stack_default reponame/imagename

Было бы полезно иметь рабочий пример, но:

Я предполагаю, что у вас нет служб в одной и той же сети докеров. Даже если вы вручную не назначаете стековые сервисы для сети (что нормально), команда stack создает тот, к которому подключены все сервисы в этом стеке. Вам нужно будет указать, что оверлейная сеть в вашей последующей службе создает команды, чтобы они могли находить друг друга в DNS и обмениваться данными внутри роя.

Например, если я создаю стек с именем nginx, он добавит все эти сервисы (если не настроено иначе в файле стека) в оверлейную сеть под названием nginx_default

Другие вопросы по тегам