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

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

Скажем, я имеют одну службу докеров, называемую worker , и базу данных SQL master-master высокой доступности между центрами обработки данных dc-a и dc-b . В настоящий момент worker будет использовать одну и ту же конфигурацию, независимо от того, запущен ли он на dc-a или dc-b .

Есть ли способ отличить конфигурацию внутреннего исполнителя или образ докера, поэтому, если worker развернут на dc-a , он запускает config-a , а если развернут на dc-b , он запускает config-b ?

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

Возможно ли это с помощью Docker Swarm?

0
задан 26 April 2018 в 18:52
1 ответ

Самое близкое, что вы можете найти, - это использовать шаблон в определении службы, но это не позволяет вам используйте метки узла или двигателя. Из этого вы можете получить {{. Node.Hostname}} , который соответствует имени хоста. Эту строку можно использовать в определении переменной среды или при монтировании тома.

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

Подробнее об использовании шаблонов с определением службы см. В документации по службе создать: https://docs.docker.com/engine/reference/commandline/service_create/#create-services-using-templates


Если бы это был я, я бы, вероятно, выбрал более простую конфигурацию двух отдельных служб с похожими конфигурациями, различающимися, возможно, одной переменной среды. Затем используйте ограничение метки узла для запуска каждой службы только на узлах в одном или другом центре обработки данных. Вы можете использовать якоря / псевдонимы yaml для копирования между службами, например:

version: '3.4'

services:
  app-east: &app-service
    image: app-image:${app_tag:-latest}
    deploy:
      replicas: 2
      placement:
        constraints:
        - 'node.labels.region==east'
    environment:
      DB: 'db-east'
      other_var: 'common value'
  app-west:
    <<: *app-service
    deploy:
      placement:
        constraints:
        - 'node.labels.region==west'
    environment:
      DB: 'db-west'

Я, честно говоря, никогда не использовал якоря и псевдонимы yaml на много уровней и изменял только одну запись массива, поэтому вы можете обнаружить, что вам нужно быть немного более детально с их использованием. Тем не менее, конечным результатом вышеизложенного должно быть 4 контейнера, 2 на востоке и еще 2 на западе, с разницей в одну переменную среды БД.

1
ответ дан 4 December 2019 в 15:58

Теги

Похожие вопросы