4

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

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

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

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

1 ответ1

5

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

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

Проблема: у вас есть несколько контейнеров (/ реплик) одного и того же сервиса 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}}) сделает имена хостов локально предсказуемыми, но они не будут разрешаться другими контейнерами.

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

Проблема: У вас есть 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 .

Ссылка:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .