Instalando o Docker no WSL 2 sem o Docker Desktop
É muito rápido e requer apenas algumas linhas de script de shell. Você também não precisará instalar o systemd dentro do WSL 2.
Essa publicação aborda como fazer isso no Ubuntu 20.04 e 22.04, mas deve funcionar com qualquer distro que suporte a execução do Docker. Digo "deveria" porque não experimentei pessoalmente todas as distros, mas não há nada sobre isso que indique que não funcionará em outras distros.
Você obterá as mesmas conveniências do Docker Desktop, como poder acessar localhost
no navegador Windows de sua escolha para acessar quaisquer serviços da Web executados no Docker, pois esse recurso é nativo do WSL 2. Os volumes também são extremamente rápidos (comparáveis aos nativos Linux).
Você também terá opções para executar o Kubernetes diretamente no WSL 2 se optar por usar o KinD ou qualquer outra ferramenta que permita executar um cluster do Kubernetes sem o Docker Desktop.
Etapa 1: Desinstalar o Docker Desktop
Como estamos instalando o Docker diretamente dentro do WSL 2, você não precisará do Docker Desktop instalado para fazer isso funcionar. Caso esteja instalado, desinstale.
Etapa 2: instalar o Docker/Docker Compose v2 no WSL 2
Aqui está a versão condensada para distribuições baseadas no Ubuntu e Debian:
# Install Docker, you can ignore the warning from Docker about using WSL
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Add your user to the Docker group
sudo usermod -aG docker $USER
# Install Docker Compose v2
sudo apt-get update && sudo apt-get install docker-compose-plugin
# Sanity check that both tools were installed successfully
docker --version
docker compose version
# Using Ubuntu 22.04 or Debian 10 / 11? You need to do 1 extra step for iptables
# compatibility, you'll want to choose option (1) from the prompt to use iptables-legacy.
sudo update-alternatives --config iptables
Se você estiver usando uma distro diferente. O Docker tem documentos para as etapas acima. Estas etapas vieram dos guias oficiais de instalação do Linux:
https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script
https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user
https://docs.docker.com/compose/install/linux/
Etapa 3: garantir que o serviço do Docker seja executado no WSL 2
No momento desta postagem, o systemd não é executado dentro do WSL 2 por padrão. Não precisaremos disso.
Tudo o que você precisa fazer é colocá-lo em ~/.profile
, .zprofile
ou arquivo equivalente:
if grep -q "microsoft" /proc/version > /dev/null 2>&1; then
if service docker status 2>&1 | grep -q "is not running"; then
wsl.exe --distribution "${WSL_DISTRO_NAME}" --user root \
--exec /usr/sbin/service docker start > /dev/null 2>&1
fi
fi
A ideia aqui é que o serviço Docker será iniciado se ainda não estiver em execução. Na primeira vez que for executado, o terminal travará por alguns segundos. No entanto, mesmo que você feche seu terminal na próxima vez que abri-lo, ele abrirá instantaneamente, pois o Docker já estará em execução. Fechar seu terminal não interromperá o Docker, apenas reiniciar o Windows ou desligar totalmente o WSL.
Você pode executar ps aux | grep docker
para ver o daemon do Docker em execução:
root 8899 ... /usr/bin/dockerd -p /var/run/docker.pid
root 8908 ... containerd --config /var/run/docker/containerd/containerd.toml --log-level info
Depois de abrir um novo terminal, você poderá executar o docker run hello-world
com sucesso sem o sudo
. A propósito, tenho vários exemplos de aplicativos da Web de código aberto no GitHub, caso você queira explorar exemplos mais detalhados do uso do Docker.
Como lembrete, o WSL 2 ainda apresenta problemas relacionados ao espaço em disco e à não recuperação da memória. Isso seria um problema com ou sem o Docker Desktop.
Não configurei corretamente e ele não está iniciando sozinho, como fazer?
Uma solução é você inicializar o Docker Daemon manualmente dando sudo dockerd
em um terminal separado. A vantagem disso é você conseguir parar o docker quando quiser, diferente do outro método que somente reiniciando/desligando o computador irá cancelar o processo.
E como deixar manual?
Só deixar o valor de "${WSL_DISTRO_NAME}"
no ~/.profile
na parte de inserir a "${WSL_DISTRO_NAME}"
, assim ele não irá identificar a distro e não irá agir automaticamente.