Docker Swarm - Невозможно подключиться к другим контейнерам, потому что поиск IP не удается - PullRequest
0 голосов
/ 12 июля 2019

Скажем, мы предоставляем оверлейную сеть с помощью Docker Swarm и создаем различные контейнеры со следующими именами:

  • Алиса
  • Bob
  • Larry
  • John

Теперь, если мы попытаемся пропинговать любой контейнер из другого, произойдет сбой, потому что он не знает, как выполнить поиск IP, т.е. Алиса не знает IP Боба и так далее. Мы позаботились об этом, вручную отредактировав /etc/hosts в каждом контейнере и введя пару имя / значение ключа IP в этом файле, но это становится очень утомительным при каждом перезапуске нашей сети. Должен быть лучший способ справиться с этим.

Например, службы, созданные с использованием стека докеров, не страдают от этой проблемы. По разным причинам мы застряли в создании контейнеров с использованием ванили docker create. Как мы можем заставить контейнеры обнаруживать друг друга в оверлейной сети без ручного труда редактирования /etc/hosts?

Ниже приведен подробный рабочий процесс, которому мы в настоящее время должны следовать:

  • мы сначала предоставляем docker swarm и оверлейную сеть
  • Затем для каждого контейнера мы создаем его с помощью команды docker create, а затем запускаем его с помощью команды docker start. мы используем флаг --network, чтобы прикрепить контейнер к оверлейной сети во время создания
  • Затем мы используем docker container inspect, чтобы получить IP-адрес каждого контейнера. Это включает выполнение команд n и запись IP-адреса.
  • Затем мы регистрируемся в каждом контейнере и вручную редактируем файл /etc/hosts и вводим пару ключ-значение (имя, IP) других контейнеров. Таким образом, это означает необходимость ввода n*(n-1) записей вручную при суммировании по контейнерам.

Не уверен, почему docker create не делает все это автоматически - докер уже знает (или может знать) все IP-адреса. Контейнеры, подготовленные с использованием стека докеров, например, не должны проходить этот ручной процесс, чтобы «обнаруживать» друг друга. Причина, по которой мы не можем использовать стек Docker, заключается в следующем:

  • не позволяет нам указать имя контейнера
  • мы запускаем различные команды (в основном docker cp) перед запуском контейнера и не можем сделать это с помощью стека

Ответы [ 2 ]

0 голосов
/ 13 июля 2019

Кажется, что единственное, что нужно, - это сослаться на контейнеры по их {name}.{network} вместо просто {name}. Нет необходимости редактировать /etc/hosts, использовать флаг --add-host или запускать дополнительный DNS-сервер. См. https://forums.docker.com/t/need-help-connecting-containers-in-swarm-mode/77944/6

Дополнительные сведения: в официальной документации для докера нигде не упоминается необходимость добавления суффикса .{network} к {containername}. Действительно, на этой ссылке, шаг № 7 в разделе Проход, суффикс .{network} не используется. Так что не уверен, зачем нам это делать. Используемая версия докера - 18.06.1-ce для Linux.

0 голосов
/ 12 июля 2019

Возможно, вы уже видели это: DNS для пользователя определяет сети

Созданы ли ваши службы, как в разделе «Присоединение службы к наложению» в этого документа

...