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 pip
e 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
networking
ubuntu
docker
Sashko Lykhenko
fonte
fonte
apt-get update
no modo interativo com a janela de encaixe?Respostas:
Como sugerido por creack na edição 866 do GitHub para Docker :
"Isso forçará o docker a recriar a ponte e reiniciar todas as regras de rede"
fonte
-d
bandeira não sai.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
: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 oNetworkManager.conf
arquivo:E comente a linha com
dns=dnsmasq
; o arquivo deve ficar assim:Por fim, reinicie o gerenciador de rede:
Teste novamente o recipiente:
fonte
A primeira coisa a verificar é executar
cat /etc/resolv.conf
no contêiner do docker . Se ele tiver um servidor DNS inválido, como, por exemplonameserver 127.0.x.x
, o contêiner não conseguirá resolver os nomes de domínio em endereços IP, portantoping google.com
falhará.A segunda coisa a verificar é executar
cat /etc/resolv.conf
na máquina host . O Docker basicamente copia o host/etc/resolv.conf
para o contêiner toda vez que um contêiner é iniciado. Portanto, se o host/etc/resolv.conf
estiver errado, o contêiner de dock também estará.Se você descobriu que o host
/etc/resolv.conf
está errado, você tem 2 opções:Codifique o servidor DNS em daemon.json. Isso é fácil, mas não ideal, se você espera que o servidor DNS seja alterado.
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
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 dedaemon.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.conf
era 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-resolved
para 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.conf
no host para o docker copiar nos contêineres.fonte