Sem conexão com a internet dentro dos contêineres do Docker

13

Não consigo executar nenhum comando que exija conexão com a Internet em qualquer contêiner do Docker.

Trabalhos:

docker run ubuntu /bin/echo 'Hello world'

Não funciona:

docker run ubuntu apt-get update

Err:1 http://archive.ubuntu.com/ubuntu xenial InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu xenial-security InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-security/InRelease  Temporary failure resolving 'archive.ubuntu.com'

Semelhante a pip e ping .

Estou no Ubuntu 16.04 e não estou usando o firewall ou o servidor proxy corporativo e tentei reiniciar o Docker.

Upd:

A atualização no modo interativo falha da mesma maneira.

docker exec -ti angry_goodall /bin/bash
apt-get update
#fails
ping google.com
#fails with "unknown host" message
ping 8.8.8.8 
# shows PING 8.8.8.8 (8.8.8.8): 56 data bytes
# and than hangs indefinetly

sudo apt-get update é executado com êxito no host, ou seja, no meu computador fora da janela de encaixe.

Atualize o Docker versão 1.12.1, compilação 23cf638

    
por Sashko Lykhenko 03.10.2016 / 11:39

3 respostas

3

Como sugerido por creack na edição nº 866 do GitHub para o Docker :

pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d

"Isso forçará o docker a recriar a ponte e a reinicializar todas as regras de rede"

    
por 03.10.2016 / 15:42
8

Há um problema semelhante no StackOverflow, onde uma solução diferente resolve esse problema com o Docker 17.09 no Ubuntu 16.04:

Verifique o conteúdo de resolv.conf :

$ cat /etc/resolv.conf

Se incluir uma linha como nameserver 127.0.1.1 , significa que os contêineres estão obtendo um servidor de nomes incorreto. Para corrigir isso, edite o arquivo NetworkManager.conf :

$ sudo pico /etc/NetworkManager/NetworkManager.conf

E comente a linha com dns=dnsmasq ; o arquivo deve ficar assim:

[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq

[ifupdown]
managed=false

Por fim, reinicie o gerenciador de rede:

$ sudo systemctl restart network-manager

Teste novamente o contêiner:

$ docker run ubuntu:16.04 apt-get update
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]
    
por 04.12.2017 / 17:21
2

A primeira coisa a verificar é executar cat /etc/resolv.conf no contêiner do docker . Se ele tiver um servidor DNS inválido, como nameserver 127.0.x.x , o contêiner não poderá resolver os nomes de domínio em endereços IP, portanto, ping google.com falhará.

A segunda coisa a verificar é executar cat /etc/resolv.conf na máquina host . O Docker basicamente copia o /etc/resolv.conf do host para o contêiner toda vez que um contêiner é iniciado. Portanto, se o /etc/resolv.conf do host estiver errado, o mesmo acontecerá com o contêiner do docker.

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

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

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

1. Hardcode DNS server in docker daemon.json

  • Edite o /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ê executar / iniciar um contêiner, o docker preencherá /etc/resolv.conf com os valores de daemon.json .

2. Corrigir /etc/resolv.conf dos hosts

Ubuntu 16.04 e anteriores

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

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

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

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

B. Ubuntu 18.04 e posterior

  • O Ubuntu 18.04 foi alterado para usar systemd-resolved para 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, de modo que o Docker usará como padrão o servidor DNS 8.8.8.8 do Google, que pode ser usado por pessoas protegidas por firewall.

  • /etc/resolv.conf é na verdade 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

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

Agora, você deve ter um /etc/resolv.conf válido no host para o Docker copiar nos contêineres.

    
por 28.06.2018 / 20:35