Os contêineres do Docker não podem resolver o DNS no Host da área de trabalho do Ubuntu 14.04

Estou tendo um problema com meus contêineres Docker no Ubuntu 14.04 LTS.O Docker funcionou bem por dois dias e, de repente, perdi toda a conectividade de rede dentro dos meus contêineres. A saída de erro abaixo inicialmente me levou a acreditar que era porque o apt-get está tentando resolver o DNS via IPv6.

Eu desativei o IPv6 na minha máquina host e ainda, removi todas as imagens, puxei o ubuntu base e ainda encontrei o problema.

Eu mudei meu / etc / resolve.servidores de nomes conf do meu servidor DNS local para os servidores DNS públicos do Google (8.8.8.8 e 8.8.4.4) e ainda não têm sorte. Também configurei o DNS para o Google no DOCKER_OPTS de/etc / default / docker e reiniciei o docker.

Também tentei puxar o coreos e o yum também não conseguiu resolver o DNS.

É estranho porque, embora o DNS não funcione, ainda recebo uma resposta quando faço ping nos mesmos servidores de atualização que o apt-get não consegue resolver.

Não estou atrás de um proxy, estou em uma rede local muito padrão e esta versão do Ubuntu está atualizada e atualizada (instalei dois dias atrás para estar mais perto do docker).

Pesquisei minuciosamente isso por meio de outras postagens sobre problemas do StackOverflow e github, mas não encontrei nenhuma resolução. Estou sem ideias sobre como resolver esse problema, alguém pode ajudar?

erro

➜  arthouse git:(docker) ✗ docker build --no-cache .Sending build context to Docker daemon 51.03 MBSending build context to Docker daemon Step 0 : FROM ubuntu:14.04 ---> 5506de2b643bStep 1 : RUN apt-get update ---> Running in 845ae6abd1e0Err http://archive.ubuntu.com trusty InReleaseErr http://archive.ubuntu.com trusty-updates InReleaseErr http://archive.ubuntu.com trusty-security InRelease   Err http://archive.ubuntu.com trusty-proposed InRelease  Err http://archive.ubuntu.com trusty Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]Err http://archive.ubuntu.com trusty-updates Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]Err http://archive.ubuntu.com trusty-security Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]Err http://archive.ubuntu.com trusty-proposed Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]Reading package lists...W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease  W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/InRelease  W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/InRelease  W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/InRelease  W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/Release.gpg  Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]W: Some index files failed to download. They have been ignored, or old ones used instead.

Container IFCONFIG / PING

➜  code  docker run -it ubuntu /bin/bashroot@7bc182bf87bb:/# ifconfigeth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:04            inet addr:172.17.0.4  Bcast:0.0.0.0  Mask:255.255.0.0          inet6 addr: fe80::42:acff:fe11:4/64 Scope:Link          UP BROADCAST RUNNING  MTU:1500  Metric:1          RX packets:7 errors:0 dropped:0 overruns:0 frame:0          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:738 (738.0 B)  TX bytes:648 (648.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:65536  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)root@7bc182bf87bb:/# ping google.comPING google.com (74.125.226.0) 56(84) bytes of data.64 bytes from lga15s42-in-f0.1e100.net (74.125.226.0): icmp_seq=1 ttl=56 time=12.3 ms--- google.com ping statistics ---1 packets transmitted, 1 received, 0% packet loss, time 0msrtt min/avg/max/mdev = 12.367/12.367/12.367/0.000 msroot@7bc182bf87bb:/# ping 8.8.8.8PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=21.8 ms64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=21.7 ms64 bytes from 8.8.8.8: icmp_seq=3 ttl=44 time=21.7 ms

Além disso, a atualização apt-get falha quando forço IPv4:

root@6d925cdf84ad:/# sudo apt-get update -o Acquire::ForceIPv4=trueErr http://archive.ubuntu.com trusty InReleaseErr http://archive.ubuntu.com trusty-updates InReleaseErr http://archive.ubuntu.com trusty-security InReleaseErr http://archive.ubuntu.com trusty-proposed InReleaseErr http://archive.ubuntu.com trusty Release.gpg  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]Err http://archive.ubuntu.com trusty-updates Release.gpg  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]Err http://archive.ubuntu.com trusty-security Release.gpg  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]Err http://archive.ubuntu.com trusty-proposed Release.gpg  Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]Reading package lists... DoneW: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease  

Woo, encontrei uma postagem no github que resolveu meu problema.

Depois que Steve K. apontou que não era realmente um problema de DNS e era um problema de conectividade, consegui encontrar uma postagem no github isso descreveu como corrigir esse problema.

Aparentemente, a ponte de rede docker0 foi desligada. Instalando bridge-utils e executando o seguinte, meu Docker está funcionando:

apt-get install bridge-utilspkill dockeriptables -t nat -Fifconfig docker0 downbrctl delbr docker0service docker restart

Se for um problema de resolvedor de DNS, aqui está a solução:

A primeira coisa a verificar é executar cat /etc/resolv.conf no Docker container. Se tiver um servidor DNS inválido, como nameserver 127.0.x.x, então o contêiner não será capaz de resolver os nomes de domínio em endereços ip, então ping google.com falha.

A segunda coisa a verificar é executar cat /etc/resolv.conf sobre o máquina host. Docker basicamente copia o host /etc/resolv.conf para o contêiner toda vez que um contêiner é iniciado. Então, se o anfitrião /etc/resolv.conf está errado, então o contêiner do docker também.

Se você descobriu que o anfitrião /etc/resolv.conf está errado, então você tem 2 opções:

  1. Hardcode o servidor DNS no daemon.json. Isso é fácil, mas não é ideal se você espera que o servidor DNS mude.

  2. Corrigir os hosts /etc/resolv.conf. Isso é um pouco mais complicado, mas é gerado dinamicamente e você não está codificando o servidor DNS.


1. Servidor DNS Hardcode no daemon do docker.json

  • Editar /etc/docker/daemon.json

    {    "dns": ["10.1.2.3", "8.8.8.8"]}
  • Reinicie o daemon do docker para que essas alterações entrem em vigor:
    sudo systemctl restart docker

  • Agora, quando você executa / inicia um contêiner, o docker será preenchido /etc/resolv.conf com os valores de daemon.json.


2. Corrigir os hosts /etc/resolv.conf

A. Ubuntu 16.04 e anteriores

  • Para Ubuntu 16.04 e anteriores, /etc/resolv.conf foi gerado dinamicamente pelo NetworkManager.

  • Comente a linha dns=dnsmasq (com um #) em /etc/NetworkManager/NetworkManager.conf

  • Reinicie o NetworkManager para regenerar /etc/resolv.conf :
    sudo systemctl restart network-manager

  • Verificar no host: cat /etc/resolv.conf

B. Ubuntu 18.04 e posterior

  • Ubuntu 18.04 alterado para uso systemd-resolved gerar /etc/resolv.conf. Agora, por padrão, ele usa um cache DNS local 127.0.0.53. Isso não funcionará dentro de um contêiner, portanto, o Docker será o padrão do servidor DNS 8.8.8.8 do Google, que pode quebrar para as pessoas por trás de um firewall.

  • /etc/resolv.conf é realmente um link simbólico (ls -l /etc/resolv.conf) que aponta para /run/systemd/resolve/stub-resolv.conf (127.0.0.53) por padrão no Ubuntu 18.04.

  • Basta alterar o link simbólico para apontar para /run/systemd/resolve/resolv.conf, que lista os servidores DNS reais:
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • Verificar no host: cat /etc/resolv.conf

Agora você deve ter um válido /etc/resolv.conf no host para docker copiar para os contêineres.

Na tentativa de adicionar valor adicional a um problema que também experimentei; com uma resposta alternativa:

Minha rede estava relacionada ao office e as configurações de DNS do Google foram bloqueadas para que o contêiner pudesse fazer ping nos endereços IP, mas não nos nomes de domínio.

Meu anfitrião /etc/resolv.conf originalmente parecia;

#Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)#DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTENnameserver 127.0.1.1search companyDomain.co.za

Isso se deve ao Gerenciador de rede fazer algum tipo de mascaramento dos detalhes do servidor DNS.

Infelizmente, de acordo com o docker manuais o docker filtrará qualquer endereço IP localhost ao criar a resolução do contêiner.conf e substituí-los com IPS DNS do Google. O que, no meu caso, fez com que os nomes de domínio estivessem fora dos limites.

Eu tive que:

  • Redefinir meu /etc/default/docker para o padrão, os contêineres usam a resolução do meu host.conteúdo conf em vez disso.
  • Editar /etc/NetworkManager/NetworManager.conf e comente a linha dns=dnsmasq. Isso significa que o NM pode especificar os endereços IP DNS reais em vez de 127.0.0.1.
  • Reiniciar NM com sudo service network-manager restart.
  • Reinicie o serviço docker com sudo service docker restart.

Executar um contêiner permitiria que ele fizesse apt-get update/upgrade, por exemplo.

Docker doc oficial fornece instrumentos para configurar um servidor DNS para uso pelo Docker

  1. Abra o /etc/default/docker arquivo para edição:

    sudo nano /etc/default/docker
  2. Adicionar uma configuração para Docker:

    DOCKER_OPTS="--dns 8.8.8.8"
  3. Substituir 8.8.8.8 com um servidor DNS local, como 192.168.1.1. Você podetambém especifique vários servidores DNS. Separou-os com espaços, paraexemplo:

    --dns 8.8.8.8 --dns 192.168.1.1

    Aviso: se você estiver fazendo isso em um laptop que se conecta a várias redes, certifique-se de escolher um servidor DNS público.

    SALMO: nm-tool pode ser usado para verificar o servidor DNS do host local

  4. Salve e feche o arquivo.

  5. Reinicie o daemon do Docker.

    sudo service docker restart

Seu erro está aqui:

 Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]

Este não é um erro com DNS, em vez disso, seu sistema está tentando se conectar a hosts IPv6 e falhando . Presumivelmente porque você não tem acesso IPv6 em seu host. A pesquisa real do endereço IPv6 é bem-sucedida. (O ubuntu mirror / archive está disponível em IPv6 e IPv4. Você teve o azar de acertar um IPv6 porque seu sistema acredita que deveria funcionar.)

Você deve consertar isso, por instalando miredo, ou tente novamente até atingir um espelho IPv4.

Novamente, o importante a perceber aqui é que o DNS não é o culpado, como você pode ver por seus próprios testes de ping.

Para outros leitores que vêm aqui enquanto usam boot2docker, aqui está como eu consertei. Na verdade, a resposta acima me apontou para a direção certa.

Basicamente, por algum motivo, os contêineres dentro do boot2docker não conseguiram resolver os nomes de host.

Então eu apenas reiniciei o boot2docker e iniciei os contêineres. Agora hostnames pode resolver corretamente novamente.

Suponho que o problema foi iniciar o boot2docker enquanto a rede no host estava sendo conectada, o que fez com que o boot2docker inicializasse e entrasse em um estado que não funcionava.

Encontrei esse problema quando permiti que o instalador do Ubuntu instalasse o pacote snap do Docker. Quando abandonei isso e mudei para o pacote oficial do Docker, o problema se resolveu.

sudo snap remove dockercurl -fsSL https://get.docker.com -o get-docker.shsh get-docker.sh

Abra o arquivo /lib/systemd/system/docker.service

Em ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sockadicionar
--dns 8.8.8.8

Comer:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --dns 8.8.8.8

Reinicie o serviço docker

Eu tive o mesmo problema no Windows. Este comando fez funcionar para mim: docker-machine restart

Tinha um problema semelhante, mas também a resolução de nomes entre contêineres dentro de uma rede definida pelo Usuário parecia um pouco esquisita. Alguns não conseguiram resolver nada como você.

O problema foi um moved / var / lib / docker. Por razões espaciais, foi montado via nfs. Adicionar um sistema de arquivos local e mover os arquivos para lá resolve o problema.

Para mim, funcionou após um reinício.