Docker Swarm: как разместить приложение и базу данных вместе? - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть стек с 2 сервисами: приложение Spring boot и база данных mongo.Я хочу развернуть этот стек в Docker Swarm (1 узел в Германии, 1 в Финляндии и 1 в Эстонии).

В настоящее время Swarm планирует приложение в кластер Германии и базу данных в Финляндию, что означает, что каждый запрос поступает из Германии.в Финляндию.

Это как заставить Swarm поместить все части стека в один узел?

PS, придерживающийся имени хоста, не является решением, потому что, если узел умирает, сервис не работает.

Мой Stack.yml:

version: '3.3'
services:
app:
  image: kyberorg/boot-mongo
  networks:
  - net
  ports:
    - "8080:8080"
  depends_on:
    - mongo
labels:
  - ee.yadev.bootmongoapp
deploy:
  mode: replicated
  replicas: 1
  update_config:
    parallelism: 1
    delay: 10s
 mongo:
   image: mongo
  networks:
    - net
  volumes:
    - example-mongo:/data/db
  deploy:
    mode: replicated
    replicas: 1
    update_config:
      parallelism: 1
      delay: 10s
networks:
  net:
   driver: overlay
volumes:
  example-mongo:
    external: true

Ответы [ 4 ]

0 голосов
/ 15 августа 2019

Я также потратил полдня на поиски решения и нашел его.

Взгляните на параметр Affinity, который довольно хорошо описан здесь: https://blog.docker.com/2015/02/scaling-docker-with-swarm/

Affinity InВ некоторых случаях размещение контейнера должно быть относительно других контейнеров.Swarm позволяет вам определять эти отношения через сходства.

Следующее запустит два сервера Redis, гарантируя, что они не будут запланированы на одном компьютере:

docker run -d --name redis_1-e 'affinity: container! = redis_ ' запуск утилиты redis -d --name redis_2 -e 'affinity: container! = redis_ ' redis

Сродства автоматически генерируются, когдасвязь между контейнерами подразумевается.Контейнеры, в которых используются такие параметры, как –link, –volumes-from и –net = container: совместно планируются на одном хосте.

0 голосов
/ 20 ноября 2018

То, что вы ищете, это что-то вроде POD в kubernetes, где возможно совместное размещение контейнеров.AFAIK, это в настоящее время недоступно в докере.

Вы можете взглянуть на этот репозиторий и посмотреть, насколько он полезен: https://github.com/rycus86/podlike

Это попытка донести концепцию стручков доdocker.

edit: если заметить, что приложение и БД настолько тесно связаны, то имеет смысл, что оба они являются частью одного контейнера.

0 голосов
/ 20 ноября 2018

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

Я также не могу придумать, как можно использовать ограничения и / или предпочтения размещения для объединения двух контейнеров в одном центре данных, а затем менеджеры перемещают их в один и тот же 2-й центр данных, если первый не работает.

Podlike, как упомянуто giabar, является опцией, но не решает вашу задачу проектирования «один рой по нескольким регионам».

0 голосов
/ 19 ноября 2018

Моя первая идея - предложить вам использовать "ограничения размещения" и "метки":

https://docs.docker.com/engine/swarm/services/#placement-constraints https://docs.docker.com/engine/swarm/manage-nodes/#add-or-remove-label-metadata

Благодаря им вы можете назначать меткиузлы для каждой страны, а затем измените свой стек, чтобы заставить приложения запускаться на том же узле.

обновление докерного узла --label-add страна = Германия узел-германия обновление докерного узла --label-addстрана = Финляндия node-finland

- ограничение node.labels.region == восток

версия: сервисы '3.3': приложение: изображение: киберорг / boot-mongo развертывание: размещение: ограничения: - страна == Германия

монго: изображение: монго развертывание: размещение: ограничения: - страна == Германия

Другие полезные ссылки:

https://semaphoreci.com/community/tutorials/scheduling-services-on-a-docker-swarm-mode-clusterhttps://container -solutions.com / using-binpack-with-docker-swarm /

Надеюсь, это поможет вам!

...