Eu tenho uma nova instalação do Ubuntu 14.04 e quero usar o Docker para executar minhas coisas antigas que precisam da versão 12.04. O DNS no 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 para 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
Posso fazer ping de ambos com êxito 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)
O que agora?
fonte
Eu mesmo não uso o docker, por isso normalmente não me intrometeria em uma pergunta sobre o docker, mas estava lendo sobre isso e me deparei com alguma documentação do docker que parece resolver esse problema exato . Resumindo...
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
:onde o DNS fornecido pode ser um servidor DNS local, como 192.168.1.1 (gateway). Em seguida, reinicie com
Uma solução alternativa envolve desabilitar o dnsmasq no NetworkManager, comentando a configuração da seguinte
/etc/NetworkManager/NetworkManager.conf
maneira:depois, reinicie os dois
fonte
/etc/default/docker
não tem mais efeito. Veja minha solução para saber como resolver isso em um mundo pós-init.d / upstart./etc/NetworkManager/NetworkManager.conf
não existe no Ubuntu 18.04 LTS. : /systemd-resolved
está agindo como um servidor DNS em cache por padrão e provocará oWARNING: Local (127.0.0.1) DNS resolver found in resolv.conf and containers can't use it.
problema (as configurações do Ubuntu 16.04 não parecem habilitá-lo por padrão). A solução alternativa é desativarsystemd-resolved
ou usar a--dns
opção ao iniciar o contêiner, conforme mencionado na resposta principal.Eu me deparei com isso na minha situação, que é especificamente
npm install
partir de um repositório personalizado na VPN , dentro do contêiner.npm
não é possível fazer uma pesquisa de DNS bem-sucedidaO Ubuntu, por padrão, usa
dnsmasq
o NetworkManager para armazenar solicitações de DNS em cache e configura/etc/resolv.conf
para apontar para esta instância em127.0.1.1
/etc/resolv.conf
que substitui a configuração do NetworkManager/etc/resolv.conf
Por padrão, o Docker dá sombras ao contêinerdnsmasq
situação.docker0
ponte de rede para os servidores DNS pelotap0
adaptador VPN .A solução :
Parece mais elegante usar o NetworkManager e sua
dnsmasq
instância cativa da maneira como foi projetada.Diga ao Docker para usar sua
dnsmasq
instância para DNSAdicione ou edite o arquivo
/etc/docker/daemon.json
para instruir o Docker a usar odocker0
adaptador de ponte para DNSConfigure a
dnsmasq
instância do NM para escutar também as pontes do Docker, porque, por padrão, apenas escuta 127.0.1.1 - criar arquivo/etc/NetworkManager/dnsmasq.d/docker-bridge.conf
Não gosto do comportamento rude desse cliente VPN e prefiro usar apenas o DNS no final da VPN para pesquisas VPN (se você tiver um cliente VPN educado que use o NetworkManager configurado corretamente, não precisará fazer isso )
resolv.conf
na conexão e agora todo o DNS passadnsmasq
novamente)Adicione um arquivo de configuração
dnsmasq
para direcionar as solicitações DNS apropriadas para o seu domínio - adicione o arquivo `/etc/NetworkManager/dnsmasq.d/vpn-dns.confOpcionalmente, adicione um domínio de pesquisa ao seu domínio para poder usar nomes abreviados
Reinicie o NetworkManager e o Docker
Nesse ponto, seus contêineres do Docker devem poder ficar
nslookup
sem problemas quando você estiver na VPN, para domínios dentro e fora da sua VPN.fonte
cannot unmarshal string into Go value of type []string
ao reiniciar o serviço docker.Aqui está como eu configuro o docker no meu servidor Ubuntu 14.04 rodando sem cabeça.
Estou executando o servidor Ubuntu 14.04 com a seguinte versão do docker instalada.
O arquivo /etc/init/docker.io.conf e o script contém a seguinte linha:
A resposta acima me ajudou a encontrar o arquivo acima.
Descomentei o seguinte em /etc/default/docker.io e adicionei meu servidor DNS local:
Reiniciou o serviço com:
Correu
docker run <image> /bin/bash
Nenhuma mensagem DNS ao iniciar o contêiner.
Iniciou um novo contêiner, instalou o dnsutils.
Ran dig e a mensagem do servidor é o servidor DNS local correto.
fonte
Eu tive um problema semelhante, relatei ao StackOverflow . Parece que não pude consultar o
8.8.8.8
servidor de nomes especificado na instalação padrão do Ubuntu do Docker; no entanto, eu poderia fazer ping. Nesse caso, use um servidor DNS que você possa realmente consultar. Teste come inicie o contêiner via
Ainda tenho que encontrar uma maneira de https://askubuntu.com/q/607172/30266 para derivar uma solução automagic.
fonte
Você pode usar o resolvedor DNS local do host (por exemplo
dnsmasq
) nos contêineres do Docker se eles estiverem em uma rede definida pelo usuário . Nesse caso, o contêiner/etc/resolv.conf
terá o servidor de nomes127.0.0.11
(também conhecido como servidor DNS incorporado do Docker ), que pode encaminhar solicitações DNS para o endereço de loopback do host corretamente.Se você usar
docker-compose
, ele configurará uma rede personalizada para seus contêineres automaticamente (com um formato de arquivo v2 + ). Observe, no entanto, que enquantodocker-compose
executa contêineres em uma rede definida pelo usuário, ele ainda os cria na rede padrão . Para usar uma rede customizada para construções, você pode especificar onetwork
parâmetro na configuração de construção (requer o formato de arquivo v3.4 + ).fonte