Tell docker para usar o servidor DNS no sistema host

4

Eu tenho dnsmasq em execução no host e quero que os contêineres do Docker utilizem isso, em vez do servidores padrão do Google ( 8.8.8.8 )

Meu host /etc/resolv.conf tem a seguinte aparência:

» cat /etc/resolv.conf 
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.0.1
search mydomain.net

E o /etc/resolv.conf do contêiner é o seguinte:

root@ubuntu:/# cat /etc/resolv.conf 
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
search mydomain.net

nameserver 8.8.8.8
nameserver 8.8.4.4

Parece que o docker está reutilizando o /etc/resolv.conf do host, mas descartando a entrada 127.0.0.1 e, em vez disso, adicionando os servidores de nomes do Google.

Eu tentei adicionar uma entrada do DNS referente à interface docker0 :

» ifconfig docker0
docker0   Link encap:Ethernet  HWaddr 02:42:8e:65:b0:88  
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:8eff:fe65:b088/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:55824 errors:0 dropped:0 overruns:0 frame:0
          TX packets:74365 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:15702804 (15.7 MB)  TX bytes:60639605 (60.6 MB)

Como segue:

docker run \
    -it \
    --name ubuntu.bionic \
    --restart always \
    --dns 172.17.0.1 \
    ubuntu:bionic

Mas o dns não está funcionando:

root@ubuntu:/# apt-get update
Err:1 http://security.ubuntu.com/ubuntu bionic-security InRelease        
  Temporary failure resolving 'security.ubuntu.com'

Como posso dell um contêiner docker para usar o servidor dns no sistema host?

EDITAR

Parece que preciso informar dnsmasq para vincular à interface docker0 :

listen-address=127.0.0.1,172.17.0.1

Eu ainda não gosto que eu precise dar o endereço IP da interface docker0 duas vezes , uma vez para o comando docker run para cada contêiner que eu deseja criar e também para a configuração dnsmasq .

EDIT2

Eu posso dizer a docker para usar por padrão meu servidor DNS local (que está sendo executado em um contêiner e acessível aos outros contêineres na docker0 interface: 172.17.0.1 ):

» sudo cat /etc/docker/daemon.json
{
    "dns": ["172.17.0.1", "8.8.8.8"]
}

Em seguida, reinicie o daemon do docker:

sudo service docker restart

Ainda estou um pouco preocupado que docker possa decidir alterar o endereço IP da interface docker0 e serei forçado a reconfigurar docker e dnsmasq e reconstruir os contêineres.

    
por dangonfast 13.03.2018 / 07:31

1 resposta

0

Você pode usar o resolvedor de DNS local do host (por exemplo, dnsmasq ) dos contêineres do Docker, se eles estiverem em uma rede definida pelo usuário . Nesse caso, o /etc/resolv.conf de um contêiner terá o servidor de nomes 127.0.0.11 (também conhecido como do Docker servidor de DNS incorporado ), que pode encaminhar os pedidos de DNS para o endereço de loopback do anfitrião de forma adequada.

$ cat /etc/resolv.conf
nameserver 127.0.0.1
$ docker run --rm alpine cat /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
$ docker network create demo
557079c79ddf6be7d6def935fa0c1c3c8290a0db4649c4679b84f6363e3dd9a0
$ docker run --rm --net demo alpine cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0    

Se você usar docker-compose , ele configurará uma rede personalizada para seus serviços automaticamente (com um formato de arquivo < href="https://docs.docker.com/compose/compose-file/compose-versioning/#version-2"> v2 + ). Observe, no entanto, que enquanto docker-compose executa contêineres em uma rede definida pelo usuário, ele ainda os constrói na rede padrão . Para usar uma rede personalizada para compilações, você pode especificar o parâmetro network na configuração de compilação (requer formato de arquivo v3.4 + ).

    
por 09.09.2018 / 10:24