Este artigo detalha como configurar um ambiente de desenvolvimento onde o código reside no sistema de arquivos do Linux (WSL), rodando em containers Docker, com debug funcional no VS Code.
1. Por que rodar no diretório do WSL? Link para o cabeçalho
Para performance máxima. O Docker Desktop no Windows tem um gargalo de IO quando acessa arquivos no /mnt/c/. Ao mover o projeto para \\wsl.localhost\Ubuntu\home\..., a aplicação Laravel pode rodar até 10x mais rápido.
2. Configuração do Docker (Dockerfile / PHP) Link para o cabeçalho
No seu container PHP (ex: PHP 7.4), o Xdebug precisa estar instalado e configurado para “discar” para o host correto.
No seu xdebug.ini (dentro do container):
[xdebug]
zend_extension=xdebug.so
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_port=9003
xdebug.client_host=host.docker.internal
xdebug.log=/tmp/xdebug.log
Dica: Se o
host.docker.internalfalhar no CLI, você pode descobrir o IP do WSL usandohostname -Ino terminal do Ubuntu e usá-lo temporariamente.
3. Configuração do VS Code (launch.json)
Link para o cabeçalho
O pulo do gato está aqui. Quando você abre o VS Code no modo WSL: Ubuntu, ele age como se estivesse dentro do Linux.
Crie ou edite o arquivo .vscode/launch.json:
{
"version": "0.2.0",
"configurations": [
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9003,
"hostname": "0.0.0.0",
"pathMappings": {
"/app/sgp": "${workspaceFolder}/backend"
}
}
]
}
Pontos de Atenção:
-
hostname:0.0.0.0: Essencial! Obriga o VS Code a ouvir conexões de qualquer interface de rede, permitindo que o tráfego do container chegue ao debugger. -
pathMappings:O lado esquerdo é o caminho dentro do container (/app/suaaplicacao). O lado direito é o caminho no WSL (${workspaceFolder}/backend).
4. Como executar e debugar Link para o cabeçalho
Para Requisições Web:
-
No VS Code, vá na aba “Run and Debug” (Ctrl+Shift+D).
-
Selecione “Listen for Xdebug” e dê Play (F5).
-
Coloque um breakpoint no seu Controller.
-
Acesse a URL no navegador.
Para Testes Unitários (PHPUnit) via Terminal:
Se você estiver dentro do container via docker exec, rode o teste injetando o host do WSL para garantir a conexão:
php -dxdebug.client_host=172.xx.xx.xx ./vendor/bin/phpunit --filter NomeDoTeste
(Substitua o IP pelo retornado por hostname -I no seu WSL).
6. Automatizando a Rede no Docker Compose Link para o cabeçalho
Para evitar ter que buscar o IP do WSL (hostname -I) manualmente toda vez que trocar de rede ou reiniciar o PC, adicione a diretiva extra_hosts ao seu serviço PHP. Isso faz com que o container reconheça o host do Windows/WSL automaticamente.
Exemplo de docker-compose.yml:
services:
php74:
build:
context: .
dockerfile: Dockerfile
container_name: php74
volumes:
- ./backend:/app/sgp
# O Pulo do Gato:
extra_hosts:
- "host.docker.internal:host-gateway"
networks:
- sgp-network
networks:
sgp-network:
driver: bridge
Por que isso é importante? O
host-gatewayé uma palavra-chave especial do Docker que resolve para o endereço IP da interface de rede do host. Com isso, sua configuração noxdebug.ini(xdebug.client_host=host.docker.internal) funcionará de forma nativa e estável.
Diagrama de Fluxo de Conexão Link para o cabeçalho
Para visualizar como o dado trafega desde o seu código até o VS Code:
-
Container: O PHP executa o código e o Xdebug dispara um pacote para
host.docker.internal:9003. -
WSL2: O Docker redireciona esse pacote para o IP do gateway do WSL.
-
VS Code: Como definimos
hostname: 0.0.0.0, o VS Code “escuta” essa batida na porta 9003 e intercepta a execução, ativando o seu breakpoint.
Resumo das Configurações de Sucesso Link para o cabeçalho
| Componente | Configuração Chave | Motivo |
|---|---|---|
| xdebug.ini | xdebug.client_host=host.docker.internal |
Define o destino do sinal de debug para o host. |
| docker-compose | extra_hosts: ["host.docker.internal:host-gateway"] |
Garante que o container resolva o IP do host corretamente no WSL2. |
| launch.json | "hostname": "0.0.0.0" |
Permite que o VS Code aceite conexões vindas de fora da interface local. |
| launch.json | "pathMappings": { "/app/sgp": "${workspaceFolder}/backend" } |
Sincroniza o caminho do arquivo no container com o arquivo no VS Code. |
6. Troubleshooting (Resumo da Solução) Link para o cabeçalho
-
Time-out? Verifique se o
hostnamenolaunch.jsonestá como0.0.0.0. -
Não para no breakpoint? Confira se o
pathMappingsaponta exatamente para a pasta onde está o arquivo artisan. -
Erro de conexão? O Firewall do Windows pode estar bloqueando a porta 9003. Tente criar uma regra de entrada para essa porta.
Com esse setup, seu ambiente Laravel no WSL fica profissional, rápido e, acima de tudo, fácil de debugar!