Sem conexão à Internet dentro dos contêineres do Docker


24

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

Trabalho:

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'

Similar com pipe ping.

Estou no Ubuntu 16.04 e não estou usando firewall ou 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


Você pode executar ping em um domínio do host? Você pode executar apt-get updateno modo interativo com a janela de encaixe?
adampski

a saída mostra o erro: Falha temporária na solução de 'archive.ubuntu.com' ... tente executar ping em www.google.com. veja se você obtém a mesma resposta. tente executar ping 8.8.8.8. . Se IP funciona, e nome do host não, então o seu DNS está quebrado (mais /etc/resolv.conf para ver qual DNS servidor está sendo usado)
TG2

@adampski, atualizei a pergunta com base em suas sugestões.
Sashko Lykhenko

@ TG2, atualizei a pergunta com base nas suas sugestões também.
Sashko Lykhenko

Qual versão do mecanismo docker você está executando?
adampski

Respostas:


13

Como sugerido por creack na edição 866 do GitHub para 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 reiniciar todas as regras de rede"


1
Eu tentei, e isso mata a rede em todo o meu computador.
Peterohn

Isso é útil e resolveu o problema para mim. Obrigado.
Rao

10
A -dbandeira não sai.
Luís de Sousa

2
Olá @ LuísdeSousa, é uma pena que você tenha rejeitado isso, mas considere a possibilidade de que talvez alguns switches sejam removidos ou alterados em versões mais recentes. Especialmente porque isso foi há mais de um ano.
adampski

3
em vez de apenas copiar / passado o comando que você poderia explicar o que estes :) média
Adelin

12

Há um problema semelhante no StackOverflow, em que 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 nameserver 127.0.1.1, significa que os contêineres estão obtendo um servidor de nomes incorreto. Para corrigir isso, edite o NetworkManager.confarquivo:

$ 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 recipiente:

$ 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]

Minha instalação corresponde à descrição e a abordagem acima resolveu o problema para mim.
precisa saber é

resposta atualizada para o Ubuntu 18.04: superuser.com/a/1335054
wisbucky 28/06

7

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

A segunda coisa a verificar é executar cat /etc/resolv.confna máquina host . O Docker basicamente copia o host /etc/resolv.confpara o contêiner toda vez que um contêiner é iniciado. Portanto, se o host /etc/resolv.confestiver errado, o contêiner de dock também estará.

Se você descobriu que o host /etc/resolv.confestá errado, você tem 2 opções:

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

  2. Corrija 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 codificado no docker daemon.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.confcom os valores de daemon.json.


2. Corrija os hosts /etc/resolv.conf

A. Ubuntu 16.04 e versões anteriores

  • Para o Ubuntu 16.04 e versões anteriores, /etc/resolv.confera gerado dinamicamente pelo NetworkManager.

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

  • Reinicie o NetworkManager para gerar novamente /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-resolvedpara gerar/etc/resolv.conf . Agora, por padrão, ele usa um cache DNS local 127.0.0.53. Como o Docker não funcionará dentro de um contêiner, o Docker usará como padrão o servidor DNS 8.8.8.8 do Google, que pode ser interrompido por pessoas protegidas por um 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 /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 válido /etc/resolv.confno host para o docker copiar nos contêineres.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.