Рейтинг:0

Хост /etc/hosts влияет на разрешение DNS внутри контейнеров Docker

флаг ru

Я работаю над проектом, в котором я запускаю один контейнер Nginx (балансировщик нагрузки) с портами 80 и 443, опубликованными на хосте, и несколько других контейнеров приложений Nginx с неопубликованными портами. Все три являются частью пользовательской мостовой сети в Docker и могут взаимодействовать друг с другом, используя имена своих контейнеров.

Я считаю, что это происходит благодаря внутреннему DNS Docker, работающему по адресу 127.0.0.11. Однако я заметил одну вещь: что бы я ни помещал свое полное доменное имя в /etc/hosts хост-системы и разрешал его в 127.0.0.1 (или 127.0.1.1), это также заставляет контейнеры разрешать это полное доменное имя в локальный IP-адрес. .

Это нормально для балансировщика нагрузки - он сам дотянется. Это также подходит для хост-системы, поскольку порты балансировщика нагрузки публикуются в хост-системе. Но он ломается в контейнерах приложений, которые больше не могут получить доступ к балансировщику нагрузки по полному доменному имени, потому что они разрешаются сами по себе.

Вот мой образец docker-compose.yaml:

версия: "3.9"
Сервисы:
  фунт:
    изображение: «bitnami/nginx: последний»
  приложение1:
    изображение: «bitnami/nginx: последний»
  приложение2:
    изображение: «bitnami/nginx: последний»

/etc/hosts моего хоста:

127.0.0.1 тестирование.орг

Затем внутри одного из контейнеров приложения:

# кот /etc/resolv.conf 
сервер имен 127.0.0.11

Файл hosts контейнера:

# кошка /etc/hosts 
127.0.0.1 локальный хост
::1 локальный хост ip6-localhost ip6-loopback
fe00::0 ip6-локальная сеть
ff00::0 префикс ip6-mcast
ff02::1 ip6-все узлы
ff02::2 ip6-все маршрутизаторы
172.23.0.2 67d3aaa71abb

И разрешение:

# копать testing.org
;; РАЗДЕЛ ОТВЕТОВ:
тестирование.орг. 0 В А 127.0.0.1

;; СЕРВЕР: 127.0.0.11#53(127.0.0.11)

Я предполагаю, что это в основном предполагаемое поведение, но я не смог найти много вариантов для управления этим.

  1. Я мог бы удалить запись в файле хоста /etc/hosts, и в этом случае настоящие DNS-серверы должны будут разрешать полное доменное имя внутри контейнеров, а также хост. Кроме того, я не был тем, кто поместил его туда, во-первых, это сделал мой облачный провайдер через cloud-init, я думаю, не знаю, по каким причинам.

  2. Я мог бы добавить явные записи хостов в каждый контейнер с полным доменным именем, указывающим на общедоступный IP-адрес или, возможно, внутренний IP-адрес балансировщика нагрузки или внутренний IP-адрес хоста. Это звучит как кошмар для поддержания.

  3. Я также не могу использовать службу DNS Docker, и в этом случае я потеряю возможность ссылаться на связанные контейнеры по их именам внутри контейнеров, что является действительно отличной функцией, которую я не хочу терять.

Есть ли другие варианты? Я что-то пропустил? Версия Docker 20.10.9, версия компоновки 1.29.2. Хост Ubuntu 20.04.

P.S. Нет, testing.org на самом деле не разрешается в 127.0.0.1, хотя хорошая попытка.

Спасибо.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.