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"
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
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"
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]
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:
Codifique o servidor DNS no daemon.json. Isso é fácil, mas não é ideal se você espera que o servidor DNS mude.
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.
Tags networking docker ubuntu