Как правильно разрешить IP другого контейнера в Docker Swarm? (DNS),

1529
Hubro

Я играю с развертыванием сервисов в Docker Swarm. У меня возникают проблемы с тем, чтобы контейнер последовательно подключался к контейнеру на другом узле.

Допустим, я создаю пул GlusterFS; Мне нужно открыть терминал в каждом контейнере и добавить демон gluster в пул. Как я обращаюсь к другим контейнерам в пуле? В настоящее время я использую IP-адрес, но что, если контейнер умирает и создается заново? Насколько я знаю, нет никакой гарантии, что новый контейнер будет иметь тот же IP-адрес. Я мог бы использовать встроенный DNS-сервер для ссылки на другие контейнеры, но я могу только разрешить имена контейнеров и идентификаторы контейнеров в IP-адресах, и оба они изменятся, если контейнер умирает и воссоздается заново, так что нет никакого смысла.

Разве я не могу разрешить имена хостов других контейнеров в их IP-адреса? Я предполагал, что будет, но это не так.

Есть ли какие-то решения моей головоломки? (У меня есть ощущение, что я могу неправильно использовать службы, и в этом случае я должен вручную создать контейнер на каждом узле.)

2
Вы пытаетесь разрешить имена хостов для такой ситуации, как «контейнер A службы X + контейнер B службы Y» или «контейнер A службы X + контейнер B службы X»? Итак, вы говорите о репликах, которые должны иметь возможность подключаться друг к другу, используя их имена хостов, или у вас есть вопрос о двух разных сервисах, которые должны подключаться друг к другу? Позже это будет легко достижимо с помощью опции `--name` службы docker create Murmel 6 лет назад 0

1 ответ на вопрос

3
Murmel

В зависимости от вашей конкретной ситуации, вы должны использовать разные решения:

Разрешение имени хоста внутри службы

Проблема: у вас есть несколько контейнеров (/ реплик) одного сервиса serviceX, например:

  • контейнер a1b3d130275aс именем хостаserviceX.1.nq4rjbae
  • контейнер 65040b1cada6с именем хостаserviceX.2.m9wl1f1r
  • контейнер 944704427b9eс именем хостаserviceX.3.3d08baql

Теперь вы хотите получить имя хоста контейнера second ( serviceX.2.m9wl1f1r) и третьего ( serviceX.3.3d08baql) из контейнера one ( 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.разрешимыми и, следовательно, создать предсказуемые имена хостов. »²« ³ »Но сейчас ни одно из них не реализовано, поэтому это решение работает только во время выполнения.

Примечание. Установка имени хоста с помощью функции шаблона (например docker service create ... --hostname {{.Service.Name}}.{{.Task.Slot}}) сделает имена хостов локально предсказуемыми, но они не будут разрешаться другими контейнерами.

Межсервисное разрешение имени хоста

Проблема: У вас есть mutliple контейнеров различных услуг 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.

Ссылка: