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

18/04/2024
DockerWSLDevOpsSolucionando problemas
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