Proxy reverso com Traefik para serviços Docker: configuração prática de produção
Quando você roda vários serviços Docker no mesmo host, o gerenciamento de portas fica confuso rapidamente. O Traefik resolve isso atuando como proxy reverso dinâmico: ele descobre containers por labels e aplica rotas automaticamente.
Este guia apresenta uma base pronta para produção com TLS automático, roteamento limpo por domínio e uma estratégia segura para o dashboard.
Visão de arquitetura
Um cenário comum inclui:
- Um ponto de entrada externo nas portas 80/443
- Uma rede Docker interna compartilhada entre Traefik e aplicações
- Labels por serviço para hostnames, middlewares e portas internas
- Resolver ACME para HTTPS automático
O Traefik monitora eventos do Docker e atualiza rotas sem reload manual, o que reduz o esforço operacional em ambientes que mudam com frequência.
1) Crie a rede compartilhada
docker network create edge
Use essa rede para o Traefik e todos os containers expostos.
2) Implante Traefik com Docker Compose
Exemplo de docker-compose.yml:
services:
traefik:
image: traefik:v3.1
container_name: traefik
restart: unless-stopped
command:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- --certificatesresolvers.letsencrypt.acme.email=admin@example.com
- --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
- --certificatesresolvers.letsencrypt.acme.httpchallenge=true
- --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web
- --api.dashboard=true
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
networks:
- edge
networks:
edge:
external: true
Crie o arquivo ACME com permissões restritas:
mkdir -p letsencrypt
touch letsencrypt/acme.json
chmod 600 letsencrypt/acme.json
3) Roteie uma aplicação com labels
Exemplo de serviço:
services:
app:
image: ghcr.io/example/myapp:latest
restart: unless-stopped
networks:
- edge
labels:
- traefik.enable=true
- traefik.http.routers.myapp.rule=Host(`app.example.com`)
- traefik.http.routers.myapp.entrypoints=websecure
- traefik.http.routers.myapp.tls.certresolver=letsencrypt
- traefik.http.services.myapp.loadbalancer.server.port=8080
O DNS de app.example.com deve apontar para o IP público do servidor.
4) Proteja endpoints operacionais
Não exponha o dashboard sem autenticação. Quando necessário, use middleware:
labels:
- traefik.http.middlewares.admin-auth.basicauth.users=admin:$$apr1$$...
- traefik.http.routers.traefik.rule=Host(`traefik.example.com`)
- traefik.http.routers.traefik.service=api@internal
- traefik.http.routers.traefik.entrypoints=websecure
- traefik.http.routers.traefik.tls.certresolver=letsencrypt
- traefik.http.routers.traefik.middlewares=admin-auth
5) Hardening para produção
- Mantenha
exposedByDefault=false - Docker socket somente leitura
- Firewall liberando apenas portas necessárias
- Rate limit em endpoints públicos
- Headers de segurança (HSTS, anti-sniff, etc.)
Exemplo de middleware de headers:
- traefik.http.middlewares.secure-headers.headers.stsSeconds=31536000
- traefik.http.middlewares.secure-headers.headers.browserXssFilter=true
- traefik.http.middlewares.secure-headers.headers.contentTypeNosniff=true
Anexe os middlewares aos routers que expõem aplicações sensíveis.
Checklist de validação
docker ps
docker logs traefik --tail=100
curl -I https://app.example.com
Resultado esperado:
- Certificado válido emitido
- Resposta
HTTP/2 200(ou status esperado da app) - Sem erro de certificado no navegador
Conclusão
Traefik é uma escolha forte para ambientes Docker-first com serviços dinâmicos. Com roteamento por labels e TLS automático, você reduz manutenção manual e melhora previsibilidade operacional.
Os maiores ganhos de confiabilidade vêm de segmentação de rede, proteção real do dashboard e políticas explícitas de middleware por aplicação.