docker.io O DNS não funciona, ele está tentando usar 8.8.8.8

26

Eu tenho uma nova instalação do Ubuntu 14.04, e quero usar o Docker para executar minhas coisas antigas que precisam do 12.04. O DNS dentro do Docker não funciona.

O resolv.conf do meu laptop se parece com:

nameserver 127.0.0.1

O que não funciona com o Docker, aparentemente. Portanto, ele tenta definir os servidores de nomes como 8.8.8.8 e 8.8.4.4; quando eu faço

$ sudo docker run -i -t ubuntu /bin/bash

Diz:

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]

E com certeza, dentro da instância do Docker, o resolv.conf se parece com:

nameserver 8.8.8.8
nameserver 8.8.4.4

Eu posso pingar os dois com sucesso na instância do Docker. No entanto, não há DNS (por exemplo, ping google.com falha).

saída ifconfig dentro do Docker:

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)

Agora o que?

    
por RemcoGerlich 02.06.2014 / 16:12

5 respostas

15

Eu mesmo não uso o docker, então eu normalmente não me meteria aqui em uma questão do docker, mas por acaso eu estava lendo sobre isso e tropecei em alguma documentação do docker que aparece resolve esse problema exato . Para resumir ...

A documentação sugere algumas soluções alternativas. A primeira é especificar o servidor DNS a ser usado pelo daemon do docker para os contêineres, adicionando a seguinte linha a /etc/default/docker :

docker_OPTS="--dns 8.8.8.8"

onde o DNS fornecido pode ser um servidor DNS local, como 192.168.1.1 (gateway). Então, reinicie com

sudo restart docker

Uma solução alternativa envolve a desabilitação do dnsmasq no NetworkManager, comentando a configuração em /etc/NetworkManager/NetworkManager.conf da seguinte forma:

#dns=dnsmasq

depois, reinicie os dois

sudo restart network-manager
sudo restart docker
    
por rocketman10404 05.06.2014 / 00:01
14

Quando o pacote do Ubuntu Docker foi atualizado para o uso do systemd, ele perdeu o suporte para o arquivo de configuração /etc/default/docker , portanto a solução inicial sugerido por rocketman10404 não funcionará mais (desabilitar dnsmasq ainda funcionaria, mas tem a desvantagem de impedindo o Ubuntu de atualizar automaticamente o servidor DNS).

Correção no novo arquivo de configuração daemon.json

Encontre o servidor DNS da sua rede:

$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]:                             10.0.0.2

Abra ou crie, se não existir, /etc/docker/daemon.json e adicione configurações de DNS à linha ExecStart :

# /etc/docker/daemon.json
{
    "dns": ["10.0.0.2", "8.8.8.8"]
}

Reinicie o daemon do docker:

$ sudo service docker restart

Eu escrevi uma postagem aprofundada no blog e também filei um bug sobre esse problema se você quiser mais detalhes.

(Originalmente resolvi abri-lo abrindo o /lib/systemd/system/docker.service e adicionei as configurações de DNS à linha ExecStart , mas isso é ruim - nós não deve editar os arquivos systemd diretamente .)

    
por Robin Winslow 24.06.2016 / 00:47
7

Eu encontrei isso na minha situação, que é especificamente

  • Executando contêineres do Docker na minha máquina de desenvolvimento local
  • Que está conectado a uma VPN
  • Alguns de nossos scripts de construção de contêiner fazem coisas como executar npm install de um repositório personalizado na VPN , dentro do contêiner.
    • Isso funciona em um pipeline de IC, mas não em nossas máquinas de desenvolvedor, porque npm não pode fazer uma pesquisa de DNS bem-sucedida
    • Também tivemos problemas com contêineres que precisam fazer pesquisas para chamar APIs REST externas

O Ubuntu, por padrão, usa dnsmasq inicializado pelo NetworkManager para armazenar em cache solicitações de DNS e configura /etc/resolv.conf para apontar para essa instância em 127.0.1.1

  • O cliente VPN que estamos usando não é compatível com o NetworkManager e força o próprio /etc/resolv.conf que sobrescreve a configuração do NetworkManager
  • Isso configura os servidores DNS para a VPN
  • O Docker cria um sombreamento de /etc/resolv.conf no contêiner por padrão
    • Geralmente no Ubuntu, ele passa os servidores DNS do Google para o container (porque ele sabe sobre a situação dnsmasq .
    • Mas é um prazer passar a configuração do servidor DNS da VPN para o contêiner
    • Não há rota do contêiner na ponte de rede docker0 para os servidores DNS sobre o adaptador tap0 da VPN.
  • Por isso, todas as pesquisas de DNS no contêiner falham porque não podem alcançar os únicos servidores DNS fornecidos com
  • Além disso, algumas redes bloqueiam solicitações para os servidores DNS do Google porque desejam espionar todas as suas pesquisas de DNS

A solução:

Parece ser mais elegante usar o NetworkManager e ele é cativo dnsmasq instance na forma como foi projetado.

  1. Diga ao Docker para usar sua instância dnsmasq para o DNS

    • Adicione ou edite o arquivo /etc/docker/daemon.json para informar ao docker para usar o adaptador docker0 bridge para DNS

      {
        "dns": ["172.17.0.1"]
      }
      
  2. Configure a instância NM dnsmasq para ouvir também as pontes Docker, porque, por padrão, ela só escuta 127.0.1.1 - criar arquivo /etc/NetworkManager/dnsmasq.d/docker-bridge.conf

    # Default Docker bridge
    interface=docker0
    # Other Docker bridges
    interface=br-*
    
  3. Não gosto do comportamento rude desse cliente VPN e prefiro usar apenas o DNS na extremidade da VPN para pesquisas de VPN (se você tiver um cliente VPN educado que use o NetworkManager configurado corretamente, não terá para fazer isso)

    • Desativar o recurso DNS no cliente VPN (ele para de substituir resolv.conf na conexão e agora todo o DNS passa por dnsmasq novamente)
    • Adicione um arquivo de configuração para informar dnsmasq para direcionar as solicitações de DNS para o seu domínio apropriadamente - adicione o arquivo '/etc/NetworkManager/dnsmasq.d/vpn-dns.conf

      server=/myprivatedomain.net/10.0.0.1  
      # or whatever your private DNS server is
      
    • Opcionalmente, adicione um domínio de pesquisa ao seu domínio para que você possa usar nomes curtos

      • Acabei de adicionar nosso domínio local à lista de pesquisa em minha conexão de rede padrão
  4. Reinicie o NetworkManager e o Docker

    sudo service network-manager restart
    sudo service docker restart
    

Neste ponto, os contêineres do Docker devem conseguir fazer nslookup sem problemas quando você estiver em VPN, para domínios dentro e fora da VPN.

    
por Adrian 19.09.2016 / 12:44
2

Aqui está como eu configurei a janela de encaixe no meu servidor Ubuntu 14.04 executando sem cabeça.

Estou executando o servidor Ubuntu 14.04 com a seguinte versão do docker instalada.

#docker version
Client version: 0.9.1
Go version (client): go1.2.1
Git commit (client): 3600720
Server version: 0.9.1
Git commit (server): 3600720
Go version (server): go1.2.1

O arquivo /etc/init/docker.io.conf e o script contém a seguinte linha:

# modify these in /etc/default/$UPSTART_JOB (/etc/default/docker)
    DOCKER=/usr/bin/$UPSTART_JOB
    DOCKER_OPTS=

A resposta acima me ajudou a encontrar o arquivo acima.

Eu descomentei o seguinte em /etc/default/docker.io e adicionei meu servidor DNS local:

# Use DOCKER_OPTS to modify the daemon startup options.  
DOCKER_OPTS="--dns 192.168.X.X"

Reiniciou o serviço com:

sudo service docker.io restart

Ran docker run <image> /bin/bash

Nenhuma mensagem de DNS ao iniciar o container.

Iniciou um novo contêiner, instalado o dnsutils.

Ran dig e a mensagem do servidor é o servidor DNS local correto.

    
por Hank 15.07.2014 / 06:41
0

Eu tive um problema parecido, o informei ao StackOverflow . Parece que não consegui consultar o servidor de nomes 8.8.8.8 especificado na instalação padrão do Ubuntu do Docker; no entanto, eu poderia pingar. Nesse caso, use um servidor DNS que você possa realmente consultar. Teste com

nslookup - dns.server.name

e inicie o contêiner via

docker run --dns=ip.addr.of.dns

Ainda não encontrei uma maneira de link derivar uma solução de automagia.

    
por krlmlr 09.04.2015 / 15:33