Чому проксі-контейнер не використовує DNS-контейнер автоматично
Спільний хост Docker, спільна мережа й вибір резолвера — це три різні речі. Простежте DNS-запит зсередини проксі.
Запуск проксі та DNS-сервера на одному хості Docker не з'єднує їхні DNS-шляхи. Важливі три окремі зв'язки:
- Мережева доступність. Окремі проєкти Compose зазвичай мають окремі мережі за замовчуванням. Розмістіть сервіси в належній спільній мережі — або в межах одного проєкту, або через мережу, явно спільну між проєктами.
- Виявлення сервісів. Вбудований DNS власної мережі Docker може розв'язувати імена контейнерів. Це дає застосунку змогу виявити сусіда; але не вибирає цього сусіда автоматично як свій DNS-резолвер.
- Вибір резолвера. Визначте резолвер, який використовується всередині проксі-контейнера. Поле
dnsу Compose приймає адреси DNS-серверів. Ім'я на кшталтdns.local, що розв'язується в застосунку, не робить його припустимим значенням для цього поля.
Простежте запит від проксі-контейнера до налаштованої адреси резолвера. Підтвердьте, що за цією адресою є маршрут і слухач DNS. Публікація порту 53 хоста створює шлях доступу з боку хоста; але не повідомляє контейнерам, що його треба використовувати. Контейнери, які поділяють мережу, можуть натомість взаємодіяти напряму.
Якщо конфігурація посилається на адресу DNS-контейнера, тримайте її стабільною за сумісної конфігурації IPAM. Динамічно виділена адреса, скопійована з учорашнього контейнера, може не спрацювати під час повторного створення. Перевірте також висхідний шлях резолвера: пересилання запитів без відповіді назад до нього самого створює інший збій, ніж недосяжний резолвер.
Нарешті, визначте, хто розв'язує призначення. HTTP-проксі, який розв'язує ім'я CONNECT, може використовувати цей шлях через контейнер; клієнт SOCKS, який розв'язує локально, можливо, ні. Пошук на хості доводить маршрут хоста, а не процесу проксі.