Как правильно определить 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,

Ссылка:

Другие вопросы по тегам