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