Я работаю над проектом, в котором я запускаю один контейнер 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)
Я предполагаю, что это в основном предполагаемое поведение, но я не смог найти много вариантов для управления этим.
Я мог бы удалить запись в файле хоста /etc/hosts, и в этом случае настоящие DNS-серверы должны будут разрешать полное доменное имя внутри контейнеров, а также хост. Кроме того, я не был тем, кто поместил его туда, во-первых, это сделал мой облачный провайдер через cloud-init, я думаю, не знаю, по каким причинам.
Я мог бы добавить явные записи хостов в каждый контейнер с полным доменным именем, указывающим на общедоступный IP-адрес или, возможно, внутренний IP-адрес балансировщика нагрузки или внутренний IP-адрес хоста. Это звучит как кошмар для поддержания.
Я также не могу использовать службу DNS Docker, и в этом случае я потеряю возможность ссылаться на связанные контейнеры по их именам внутри контейнеров, что является действительно отличной функцией, которую я не хочу терять.
Есть ли другие варианты? Я что-то пропустил? Версия Docker 20.10.9, версия компоновки 1.29.2. Хост Ubuntu 20.04.
P.S. Нет, testing.org на самом деле не разрешается в 127.0.0.1, хотя хорошая попытка.
Спасибо.