Resolvendo o Erro "Network is Unreachable" no Docker com WSL 2

Resolvendo o Erro "Network is Unreachable" no Docker com WSL 2
Se você se deparou com o erro abaixo ao tentar rodar uma imagem Docker no WSL (Windows Subsystem for Linux), este guia é pra você:
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon:
Get "https://registry-1.docker.io/v2/library/hello-world/manifests/...":
dial tcp [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]:xxx: connect: network is unreachable
Por que isso acontece?
Esse erro geralmente está ligado a problemas de conectividade de rede — principalmente relacionados ao uso do IPv6 no WSL 2. Por padrão, o WSL pode não estar totalmente configurado para lidar com IPv6, o que afeta a comunicação com o registro de imagens do Docker.
O Docker, por sua vez, pode tentar resolver domínios via IPv6 e falhar caso essa configuração esteja ausente ou incorreta. A solução é forçar o uso de IPv4 e configurar corretamente o DNS.
Passo a Passo para Solucionar o Problema
Aqui estão algumas etapas que você pode seguir para resolver o problema de conectividade com o Docker no WSL 2. Essas etapas foram testadas e funcionaram para mim, mas podem variar dependendo da configuração do seu sistema.
Solução Rápida
Esses passos são diretos e resolvem o problema na maioria dos casos.
1. Configure manualmente os servidores DNS
Abra o arquivo de DNS no WSL:
sudo nano /etc/resolv.conf
E adicione os servidores DNS desejados. Por exemplo, você pode usar os servidores DNS do Google e Cloudflare:
nameserver 8.8.8.8
nameserver 1.1.1.1
2. Impedir que o WSL sobrescreva o '/etc/resolv.conf'
Edite o arquivo de configuração do WSL:
sudo nano /etc/wsl.conf
Adicione:
[network]
generateResolvConf = false
3. 3. Recrie o '/etc/resolv.conf' manualmente
Remova o arquivo resolv.conf atual:
sudo rm /etc/resolv.conf
echo -e "nameserver 8.8.8.8
nameserver 1.1.1.1" | sudo tee /etc/resolv.conf
4. Reinicie o WSL
No PowerShell (como administrador):
wsl --shutdown
5. Teste novamente o Docker
docker run hello-world
Se funcionar, você está pronto para seguir com seus containers
Solução Avançada (caso a rápida não funcione)
Se o problema persistir, siga essas etapas extras:
1. Configure o Docker para desabilitar IPv6
Edite o arquivo daemon.json:
sudo nano /etc/docker/daemon.json
Adicione:
{
"ipv6": false,
"dns": ["8.8.8.8", "1.1.1.1"]
}
2. Desabilite o IPv6 no sistema
sudo nano /etc/sysctl.conf
Inclua:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
3. Aplique as configurações
Após editar o arquivo sysctl.conf, aplique as configurações com o seguinte comando:
sudo sysctl -p
4. Reinicie o Docker
sudo systemctl restart docker
# OU
sudo service docker restart
Dicas de Limpeza (opcional)
Se quiser limpar seu ambiente Docker para recomeçar:
# Remover todos os containers
docker rm -f $(docker ps -aq)
# Remover todas as imagens
docker rmi -f $(docker images -aq)
# Remover todos os volumes
docker volume prune -f
# Verificar o estado atual
docker ps -a
docker images
docker volume ls
Considerações finais
Com esses ajustes, você deve conseguir restaurar a conectividade do Docker no WSL 2. Essa é uma dor comum entre devs que usam o WSL no dia a dia — então, salve este guia para consultar sempre que precisar!
#Docker #WSL #TroubleShooting #DevOps #ContainerDevelopment