Подтвердить что ты не робот

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?

4b9b3361

Ответ 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