2016-03-02 18 views
23

Próbuję pozbyć się przestarzałych linków Docker w mojej konfiguracji. Pozostało tylko pozbyć się błędów odwrotnego proxy od Bad Gateway po odtworzeniu kontenera.Docker Network Nginx Resolver

Uwaga: Używam sieci Docker w trybie pomostowym. (docker network create nettest)

używam następującej konfiguracji fragment wewnątrz nginx:

location/{ 
     resolver 127.0.0.1 valid=30s; 
     set $backend "http://confluence:8090"; 
     proxy_pass $backend; 
  1. zacząłem pojemnik z hosta confluence na mojej sieci Docker z nazwą nettest.
  2. Następnie uruchomiłem kontener nginx w sieci nettest.
  3. mogę pingować confluence od wewnątrz pojemnika nginx
  4. confluence notowanej wewnątrz pojemnika nginx za /etc/hosts pliku
  5. nginx log mówi `send() nie powiodło się (111: Connection refused) podczas rozwiązywania, przelicznik: 127.0.0.1: 53``
  6. próbowałem sieci doker domyślne nazw dNS 127.0.0.11 od /etc/resol.conf
  7. nginx dzienniku mówi confluence could not be resolved (3: Host not found)

Ktoś wie, jak skonfigurować resolwera nginx z Docker Networks lub alternatywnie, jak zmusić Nginx do poprawnego rozwiązania nazwy hosta sieci Docker?

+0

Nie wygląda ten zostanie rozwiązany w inny sposób bez sterownika sieciowego. Przyczyną jest Nginx ze względu na potrzebę IP dla resolwera i nie można tego automatycznie połączyć z żadnym repozytorium DNS zarządzanym przez Docker. – blacklabelops

Odpowiedz

43

Po pierwsze, powinieneś używać wbudowanego serwera DNS Docker pod adresem 127.0.0.11.

Twój problem może być spowodowany przez 1 z następujących powodów:

  1. nginx stara się wykorzystać IPv6 (rekord AAAA) dla zapytań DNS.

    Patrz rozwiązanie https://stackoverflow.com/a/35516395/1529493.

    Zasadniczo coś takiego:

    http { 
        resolver 127.0.0.11 ipv6=off; 
    } 
    

    To chyba nie problem z Döcker 1.11:

    Fix nie forward kwerend IPv6 domen doker do zewnętrznych serwerów (#21396)

  2. Uważaj, aby przypadkowo nie zastąpić resolver dyrektywa konfiguracyjna. W moim przypadku miałem w bloku serverresolver 8.8.8.8 8.8.4.4; z Mozilla's SSL Configuration Generator, który nadpisał resolver 127.0.0.11; w bloku http. Przez długi czas musiałem drapać się po głowie ...


Zobacz https://trac.nginx.org/nginx/ticket/658#comment:5 na jak uniknąć hardcoding adres IP serwera DNS.

Zasadniczo utworzyć skrypt startowy dla pojemnika Docker, np .:

#!/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;" 

Biorąc masz np

http { 
    # ... 

    resolver $NAMESERVERS; 

    include /etc/nginx/conf.d/*.conf; 
} 

w /etc/nginx/nginx.conf.tmpl.

Osobiście używam confd, co znacznie ułatwia zarządzanie.

+0

Dziękuję, działa idealnie! – blacklabelops

+0

dzięki to mi też pomogło – Plato

+4

Kodowanie twardego dysku adresu IP Docker DNS resolver ('127.0.0.11') nie powinno stanowić problemu, ponieważ nie ulegnie zmianie. Zauważ, że resolwer Docker DNS jest dostępny tylko w sieciach zdefiniowanych przez użytkownika ('sieć dokowania utwórz ...'). Odnośnik: https://github.com/docker/docker/issues/22652 –

0

Potrzebujesz lokalnego serwera dns, takiego jak dnsmasq do rozwiązania przy użyciu 127.0.0.1. Spróbuj zainstalować go używając apk add --update dnsmasq i skonfiguruj go, jeśli używasz wersji alpejskiej (nginx:alpine).

0

Może należy sprawdzić, czy pojemnik na /etc/resolv.conf

To pokazuje prawidłową config DNS kontenera, a następnie użyć tego IP serwera DNS dla rezolwerem.

127.0.0.11 nie działa w Rancher

+0

Proszę spojrzeć na zaakceptowaną odpowiedź. Ponieważ istnieje akceptowana odpowiedź, oznacza to, że kwestia PO została już rozwiązana i jest to jedyny cel odpowiedzi. To sprawia, że ​​twoja osoba jest dość niepotrzebna. –

+0

Przepraszam, tylko po dodatkowe zalecenia. Ponieważ mój przyjaciel narzekał, że to nie działa, może przeczytaliśmy odpowiedzi ostrożniej – exiaohao

+0

Wiem, że jesteś nowy w Stack Overflow i na początku musisz przyzwyczaić się do zasad tutaj. Co obejmuje odpowiedzi, powłoka rozwiązuje tylko problem OP. Więc nic poza jedyną i kompletną odpowiedzią. Nie ma więc dodatkowego pytania, sugestii, podpowiedzi czy czegokolwiek. Przy okazji, witamy w Stack Overflow. :-) –