Mam nową instalację Ubuntu 14.04 i chcę używać Dockera do uruchamiania starych rzeczy, które wymagają wersji 12.04. DNS wewnątrz Dockera nie działa.
Plik resolv.conf mojego laptopa wygląda następująco:
nameserver 127.0.0.1
Co najwyraźniej nie działa z Dockerem. Dlatego próbuje ustawić serwery nazw na 8.8.8.8 i 8.8.4.4; kiedy robię
$ sudo docker run -i -t ubuntu /bin/bash
To mówi:
WARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it. Using default external servers : [8.8.8.8 8.8.4.4]
I rzeczywiście, w instancji Docker resolv.conf wygląda następująco:
nameserver 8.8.8.8
nameserver 8.8.4.4
Mogę pingować oba z powodzeniem z poziomu instancji Docker. Jednak nie ma DNS (np. ping google.com
Kończy się niepowodzeniem).
Dane wyjściowe ifconfig wewnątrz Dockera:
eth0 Link encap:Ethernet HWaddr aa:e9:9f:83:9d:92
inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::a8e9:9fff:fe83:9d92/64 Scope:Link
UP BROADCAST RUNNING MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:648 (648.0 B) TX bytes:738 (738.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Co teraz?
źródło
Sam nie używam Dockera, więc normalnie nie wchodziłbym tutaj w pytanie dotyczące Dockera, ale akurat czytałem o tym i natknąłem się na dokumentację Dockera, która wydaje się rozwiązać ten konkretny problem . Podsumowując ...
Dokumentacja sugeruje kilka obejść. Pierwszym jest określenie serwera DNS, który ma być używany przez demona dokera dla kontenerów, poprzez dodanie następującego wiersza do
/etc/default/docker
:gdzie podany DNS może być lokalnym serwerem DNS, takim jak 192.168.1.1 (brama). Następnie uruchom ponownie za pomocą
Alternatywne rozwiązanie polega na wyłączeniu dnsmasq w NetworkManager przez komentowanie konfiguracji w następujący
/etc/NetworkManager/NetworkManager.conf
sposób:następnie uruchom ponownie oba
źródło
/etc/default/docker
nie ma już żadnego efektu. Zobacz moje rozwiązanie, jak to rozwiązać w świecie post-init.d / upstart./etc/NetworkManager/NetworkManager.conf
nie istnieje na Ubuntu 18.04 LTS. : /systemd-resolved
domyślnie działa jako buforujący serwer DNS i spowodujeWARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it.
problem (konfiguracje Ubuntu 16.04 domyślnie nie włączają go). Obejściem tego problemu jest wyłączeniesystemd-resolved
lub użycie--dns
opcji podczas uruchamiania kontenera, jak wspomniano w głównej odpowiedzi.Wpadłem na to w mojej konkretnej sytuacji
npm install
z niestandardowego repozytorium w sieci VPN w kontenerze.npm
nie można przeprowadzić pomyślnego wyszukiwania DNSUbuntu domyślnie używa
dnsmasq
uruchomionego przez NetworkManager do buforowania żądań DNS i konfiguruje,/etc/resolv.conf
aby wskazywać na to wystąpienie127.0.1.1
/etc/resolv.conf
który zastępuje konfigurację NetworkManager/etc/resolv.conf
domyślnie ukrywa twój cień w kontenerzednsmasq
sytuacji.docker0
moście sieciowym do serwerów DNS przeztap0
adapter VPN .Rozwiązanie :
Bardziej eleganckie byłoby używanie NetworkManagera i jego
dnsmasq
instancji w sposób, w jaki został zaprojektowany.Powiedz Dockerowi, aby używał twojej
dnsmasq
instancji dla DNSDodaj lub edytuj plik,
/etc/docker/daemon.json
aby poinformować dokera o użyciudocker0
adaptera mostu dla DNSSkonfiguruj
dnsmasq
instancję NM, aby nasłuchiwała również mostków Docker, ponieważ domyślnie nasłuchuje tylko 127.0.1.1 - utwórz plik/etc/NetworkManager/dnsmasq.d/docker-bridge.conf
Nie podoba mi się niegrzeczne zachowanie tego klienta VPN i wolę używać DNS po stronie VPN do wyszukiwania VPN (jeśli masz uprzejmego klienta VPN, który używa poprawnie skonfigurowanego NetworkManagera, nie musisz tego robić )
resolv.conf
po połączeniu, a teraz cały DNS przechodzidnsmasq
ponownie)Dodaj plik konfiguracyjny, aby
dnsmasq
odpowiednio kierować żądania DNS dla swojej domeny - dodaj plik `/etc/NetworkManager/dnsmasq.d/vpn-dns.confOpcjonalnie dodaj domenę wyszukiwania dla swojej domeny, aby móc używać krótkich nazw
Uruchom ponownie NetworkManager i Docker
W tym momencie kontenery Docker powinny być w stanie obejść się
nslookup
bez problemów, gdy jesteś w VPN, dla domen zarówno wewnątrz, jak i poza VPN.źródło
cannot unmarshal string into Go value of type []string
pojawia się błąd: po ponownym uruchomieniu usługi dokowania.Oto jak skonfigurowałem dokera na moim serwerze Ubuntu 14.04 działającym bez głowy.
Korzystam z serwera Ubuntu 14.04 z zainstalowaną następującą wersją dokera.
Plik /etc/init/docker.io.conf i skrypt zawiera następujący wiersz:
Powyższa odpowiedź pomogła mi znaleźć powyższy plik.
Odkomentowałem następujące elementy w /etc/default/docker.io i dodałem mój lokalny serwer DNS:
Uruchomiłem ponownie usługę z:
Biegł
docker run <image> /bin/bash
Brak komunikatów dns podczas uruchamiania kontenera.
Uruchomiłem nowy kontener, zainstalowałem dnsutils.
Ran dig, a komunikat serwera jest prawidłowym lokalnym serwerem DNS.
źródło
Miałem podobny problem, zgłosiłem go StackOverflow . Wygląda na to, że nie mogłem
8.8.8.8
przesłać zapytania do serwera nazw określonego w domyślnej instalacji Docker w systemie Ubuntu; jednak mogę pingować. W takim przypadku skorzystaj z serwera DNS, do którego możesz faktycznie wysłać zapytanie. Przetestuj za pomocąi uruchom kontener przez
Muszę jeszcze znaleźć sposób na https://askubuntu.com/q/607172/30266, aby uzyskać rozwiązanie automagiczne.
źródło
Możesz użyć lokalnego resolvera DNS hosta (np.
dnsmasq
) Z kontenerów Docker, jeśli są one w sieci zdefiniowanej przez użytkownika . W takim przypadku kontener/etc/resolv.conf
będzie miał serwer nazw127.0.0.11
(zwany także wbudowanym serwerem DNS Dockera ), który może poprawnie przekazywać żądania DNS na adres zwrotny hosta.Jeśli go użyjesz
docker-compose
, automatycznie skonfiguruje niestandardową sieć dla twoich kontenerów (w formacie pliku v2 + ). Należy jednak pamiętać, że chociażdocker-compose
działa kontenery w sieci zdefiniowanej przez użytkownika, nadal buduje je w sieci domyślnej . Aby użyć sieci niestandardowej do kompilacji, możesz określićnetwork
parametr w konfiguracji kompilacji (wymaga formatu pliku v3.4 + ).źródło