Gerencie Múltiplos Projetos Docker com Domínios .test de Forma Simples e Dinâmica
Se você trabalha com Docker e gerencia vários projetos locais, provavelmente já se cansou de editar o arquivo /etc/hosts
toda vez que precisa de um novo domínio. A boa notícia é que existe uma maneira muito mais inteligente e eficiente de fazer isso: configurando um DNS local e um reverse proxy dinâmico.
Neste tutorial, vamos mostrar como você pode resolver qualquer domínio .test
para o seu ambiente de desenvolvimento e, em seguida, usar um proxy dinâmico para rotear as requisições para os containers certos. Isso vai automatizar todo o processo e liberar você para focar no que realmente importa: o código.
Passo 1: Resolvendo Domínios .test
para 127.0.0.1
O primeiro passo é garantir que seu sistema operacional saiba para onde enviar as requisições de qualquer domínio que termine em .test
. O jeito mais simples de fazer isso no Ubuntu é usando o dnsmasq
, um servidor DNS leve e fácil de configurar.
1. Instale o dnsmasq:
Abra o terminal e execute o seguinte comando:
Bash
sudo apt install dnsmasq
2. Crie a configuração para .test:
Agora, vamos criar um arquivo de configuração que instrui o dnsmasq a redirecionar todos os domínios .test para o endereço local 127.0.0.1.
Bash
echo "address=/.test/127.0.0.1" | sudo tee /etc/dnsmasq.d/test.conf
3. Reinicie o serviço:
Para que as novas configurações entrem em vigor, reinicie o dnsmasq:
Bash
sudo systemctl restart dnsmasq
4. Verifique a configuração:
Para confirmar que tudo está funcionando, abra o terminal e tente dar um ping em algum domínio .test qualquer. Se a resposta for do 127.0.0.1, deu tudo certo!
Bash
ping meuprojeto.test
ping api.minha.aplicacao.test
Passo 2: Reverse Proxy Dinâmico com Docker
Com o DNS local resolvido, o próximo passo é usar um reverse proxy dinâmico dentro do Docker. Esse proxy “escuta” o tráfego na porta 80 e, com base no domínio que a requisição está tentando acessar, a encaminha para o container correto. Existem duas ótimas opções para isso: Traefik e nginx-proxy.
Opção A: Traefik (Recomendado)
O Traefik é um reverse proxy moderno, com recursos robustos e um painel de controle interativo. Ele se integra nativamente ao Docker e detecta novos containers automaticamente com base em labels que você define.
1. Crie uma rede de proxy externa:
É uma boa prática criar uma rede exclusiva para o proxy.
Bash
docker network create proxy
2. Adicione o Traefik ao seu docker-compose.yml:
No seu arquivo docker-compose.yml, adicione o serviço do Traefik. Certifique-se de que ele esteja na rede proxy.
YAML
services:
traefik:
image: traefik:v3.1
container_name: traefik
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
ports:
- "80:80"
- "8081:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- proxy
networks:
proxy:
external: true
O
api.insecure=true
é para habilitar o painel do Traefik, que será acessível na porta8081
(http://localhost:8081), ideal para ambientes de desenvolvimento.
3. Adicione labels aos seus projetos:
Agora, para cada projeto que você subir, basta adicionar as labels de configuração do Traefik. Elas dizem ao Traefik qual domínio o container deve responder e para qual porta ele deve encaminhar o tráfego.
YAML
services:
laravel:
build: ./backend
container_name: laravel_app
networks:
- proxy
labels:
- "traefik.enable=true"
- "traefik.http.routers.laravel.rule=Host(`laravel.test`)"
- "traefik.http.services.laravel.loadbalancer.server.port=80"
api:
build: ./backend
container_name: laravel_api
networks:
- proxy
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`api.laravel.test`)"
- "traefik.http.services.api.loadbalancer.server.port=80"
Com essa configuração, o Traefik irá rotear as requisições:
http://laravel.test
para o containerlaravel_app
http://api.laravel.test
para o containerlaravel_api
Opção B: nginx-proxy (Mais Simples)
O nginx-proxy é uma alternativa mais leve e fácil de usar. Ele também se conecta ao socket do Docker e configura um proxy reverso para os seus containers, mas usa uma variável de ambiente chamada VIRTUAL_HOST
.
1. Crie a rede de proxy externa:
Se ainda não a criou, execute:
Bash
docker network create proxy
2. Adicione o nginx-proxy ao seu docker-compose.yml
:
YAML
services:
nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx_proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
- proxy
networks:
proxy:
external: true
3. Defina a variável VIRTUAL_HOST nos seus projetos:
Para cada container, basta adicionar a variável de ambiente VIRTUAL_HOST com o domínio que você deseja usar.
YAML
services:
laravel:
build: ./backend
container_name: laravel_app
environment:
- VIRTUAL_HOST=laravel.test
networks:
- proxy
api:
build: ./backend
container_name: laravel_api
environment:
- VIRTUAL_HOST=api.laravel.test
networks:
- proxy
O nginx-proxy irá detectar a variável e configurar o roteamento automaticamente. Simples assim!
Resumo
dnsmasq
: Resolve qualquer domínio.test
para127.0.0.1
em nível de sistema.- Traefik: Reverse proxy dinâmico e moderno, ideal para quem precisa de mais recursos como painel de controle e suporte a HTTPS em ambiente de desenvolvimento.
- nginx-proxy: Alternativa mais simples e leve, perfeita para quem busca uma solução rápida e sem complicações.
Com essa configuração, você nunca mais precisará tocar no arquivo /etc/hosts
para gerenciar seus projetos locais. O fluxo de trabalho se torna muito mais ágil e organizado.