Я в процессе развертывания настройки роя докеров высокой доступности в нескольких центрах обработки данных, но у меня есть небольшой вопрос высокого уровня о различиях конфигурации.
Скажем, я имеют одну службу докеров, называемую 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?
Самое близкое, что вы можете найти, - это использовать шаблон в определении службы, но это не позволяет вам используйте метки узла или двигателя. Из этого вы можете получить {{. 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 на западе, с разницей в одну переменную среды БД.