Как правильно определить IP-адрес другого контейнера в Docker Swarm? (DNS),
Я играю с развертыванием сервисов в Docker Swarm. У меня проблемы с тем, чтобы контейнер постоянно подключался к контейнеру на другом узле.
Допустим, я создаю пул GlusterFS; Мне нужно открыть терминал в каждом контейнере и добавить демон gluster в пул. Как я обращаюсь к другим контейнерам в пуле? В настоящее время я использую IP-адрес, но что, если контейнер умирает и создается заново? Насколько я знаю, нет гарантии, что новый контейнер будет иметь тот же IP-адрес. Я мог бы использовать встроенный DNS-сервер для ссылки на другие контейнеры, но я могу только разрешить имена контейнеров и идентификаторы контейнеров в IP-адресах, и оба они изменятся, если контейнер умирает и воссоздается заново, так что нет никакого смысла.
Разве я не могу разрешить имена хостов других контейнеров в их IP-адреса? Я предполагал, что будет, но это не так.
Есть ли какие-то решения моей головоломки? (У меня есть ощущение, что я могу неправильно использовать сервисы, и в этом случае я должен вручную создать контейнер на каждом узле.)
1 ответ
В зависимости от вашей конкретной ситуации, вы должны использовать разные решения:
Разрешение имени хоста внутри службы
Проблема: у вас есть несколько контейнеров (/ реплик) одного сервиса serviceX
Например:
- контейнер
a1b3d130275a
с именем хостаserviceX.1.nq4rjbae
- контейнер
65040b1cada6
с именем хостаserviceX.2.m9wl1f1r
- контейнер
944704427b9e
с именем хостаserviceX.3.3d08baql
Теперь вы хотите получить имя второго узла (serviceX.2.m9wl1f1r
) и третий (serviceX.3.3d08baql
) контейнер изнутри контейнера один (serviceX.1.nq4rjbae
).
Docker предоставляет решение, называемое обнаружением контейнеров, с использованием DNS-запроса tasks.$serviceName
Например:
nslookup tasks.serviceX
[...]
Name: tasks.serviceX
Address 1: 10.0.0.205 a1b3d130275a (<- resolved locally by /etc/hosts)
Address 2: 10.0.0.206 serviceX.2.m9wl1f1r
Address 3: 10.0.0.207 serviceX.3.3d08baql
Есть также обсуждения по созданию serviceX.{1,2,3}
разрешимые и, следовательно, создающие предсказуемые имена хостов. ² ³ ⁴ Но пока что ни одно из них не реализовано, поэтому это решение работает только во время выполнения.
Примечание: установка имени хоста с помощью функции шаблона (например, docker service create ... --hostname {{.Service.Name}}.{{.Task.Slot}}
) сделает имена хостов локально предсказуемыми, но они не будут разрешены другими контейнерами.
Межсервисное разрешение имени хоста
Проблема: у вас есть несколько контейнеров различных служб serviceX
, serviceY
, Но только один контейнер на услугу, например:
- контейнер
a1b3d130275a
с именем хостаserviceX.1.nq4rjbae
- контейнер
65040b1cada6
с именем хостаserviceY.2.m9wl1f1r
И вы хотите подключиться к контейнеру другого сервиса (serviceX
) из одного сервиса (serviceY
) и наоборот. Вам нужно только использовать --name
параметр:
docker service create --name=serviceX serviceX
docker service create --name=serviceY serviceY
И вы можете положиться на этот контейнер a1b3d130275a
будет разрешаться по имени хоста serviceX
и контейнер 65040b1cada6
по имени хоста serviceY
,
Ссылка:
- Cker Docker - Проблема - Не удается получить доступ к контейнерам по имени хоста с драйвером оверлея Docker в режиме Swarm.
- ² сделать имя задачи в качестве сетевого псевдонима для контейнера поддержки
- ³ Определить схему для отображения ресурсов службы в DNS
- ⁴ Сделать службу поддержки псевдонимов сети шаблонов