Docker Network Nginx Resolver
Я пытаюсь избавиться от устаревших ссылок Docker в моей конфигурации. Осталось избавиться от ошибок Bad Gateway
nginx обратного прокси-сервера, когда я воссоздал контейнер.
Примечание. Я использую сети Docker в режиме моста. (docker network create nettest
)
Я использую следующий фрагмент конфигурации внутри nginx:
location / {
resolver 127.0.0.1 valid=30s;
set $backend "http://confluence:8090";
proxy_pass $backend;
- Я начал контейнер с именем хоста
confluence
в моей сети Docker с именем nettest
.
- Затем я запустил контейнер nginx в сети
nettest
.
- Я могу выполнить ping
confluence
из контейнера nginx
-
confluence
указан внутри контейнера /etc/hosts
файла nginx
- nginx log говорит: `send() не удалось (111: Connection failed) при разрешении, resolver: 127.0.0.1: 53``
- Я попробовал docker network default dns resolver
127.0.0.11
из /etc/resol.conf
- nginx log говорит
confluence could not be resolved (3: Host not found)
Кто-нибудь знает, как настроить nginx-резольвер с Docker Networks или альтернативу тому, как заставить Nginx правильно разрешать сетевое имя хоста Docker?
Ответы
Ответ 1
Прежде всего, вы должны использовать встроенный DNS-сервер Docker в 127.0.0.11
.
Ваша проблема может быть вызвана одним из следующих действий:
-
nginx пытается использовать IPv6 (запись AAAA) для DNS-запросов.
См. fooobar.com/questions/265010/... для решения.
В основном что-то вроде:
http {
resolver 127.0.0.11 ipv6=off;
}
Вероятно, это уже не проблема с Docker 1.11:
Исправить, чтобы не пересылать запросы домена IP-протокола докеры на внешние серверы (# 21396)
-
Позаботьтесь о том, чтобы вы случайно не отменили директиву конфигурации resolver
. В моем случае я был в блоке server
resolver 8.8.8.8 8.8.4.4;
из Mozilla SSL Configuration Generator, который переопределял resolver 127.0.0.11;
в http
блок. Это заставило меня почесывать голову надолго...
Смотрите https://trac.nginx.org/nginx/ticket/658#comment:5, чтобы избежать жесткого кодирования IP-адреса DNS-сервера.
В основном создайте запуск script для вашего контейнера Docker, например:
#!/bin/bash
export NAMESERVERS=$(cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}' | tr '\n' ' ')
envsubst '$NAMESERVERS' < /etc/nginx/nginx.conf.tmpl > /etc/nginx/nginx.conf
exec nginx -g "daemon off;"
Учитывая, что у вас есть, например,
http {
# ...
resolver $NAMESERVERS;
include /etc/nginx/conf.d/*.conf;
}
в /etc/nginx/nginx.conf.tmpl
.
Лично я использую confd, что делает вещи намного более управляемыми.
Ответ 2
Для решения проблемы с использованием 127.0.0.1 вам нужен локальный DNS-сервер, например dnsmasq
. Попробуйте установить его с помощью apk add --update dnsmasq
и настройте его, если вы используете альпийский вариант (nginx:alpine
).
Ответ 3
Возможно, вы должны проверить свой контейнер /etc/resolv.conf
Он показывает правильную конфигурацию DNS вашего контейнера, а затем использует этот IP-адрес DNS-сервера для распознавателя.
127.0.0.11
не работает в Rancher