Este guia explica como configurar o Traefik e o Portainer no modo Swarm, incluindo o Portainer Agent para acessar volumes.
- Docker instalado (versão 20+)
- Docker Swarm inicializado
- Rede overlay criada
version: "3.8"
services:
traefik:
image: traefik:latest
networks:
- network_public
ports:
- target: 80
published: 80
mode: host
- target: 443
published: 443
mode: host
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock
- /docker/traefik/traefik.toml:/traefik.toml:ro
- /docker/traefik/traefik_dynamic.toml:/traefik_dynamic.toml:ro
- /docker/traefik/acme.json:/acme.json
deploy:
mode: global
placement:
constraints:
- node.role == manager
restart_policy:
condition: any
logging:
options:
max-size: "10m"
max-file: "3"
portainer:
image: portainer/portainer-ce:latest
networks:
- network_public
volumes:
- portainer_data:/data
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
restart_policy:
condition: any
labels:
- "traefik.enable=true"
- "traefik.http.routers.portainer.rule=Host(`portainer.SEU_DOMINIO`)"
- "traefik.http.routers.portainer.tls=true"
- "traefik.http.routers.portainer.tls.certresolver=lets-encrypt"
- "traefik.http.services.portainer.loadbalancer.server.port=9000"
- "traefik.docker.network=network_public"
logging:
options:
max-size: "10m"
max-file: "3"
portainer_agent:
image: portainer/agent:latest
networks:
- network_public
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/lib/docker/volumes:/var/lib/docker/volumes
deploy:
mode: global
restart_policy:
condition: any
logging:
options:
max-size: "10m"
max-file: "3"
volumes:
traefik_config:
portainer_data:
networks:
network_public:
external: truedocker swarm initdocker network create --driver=overlay network_publicdocker stack deploy -c docker-compose.yml minha_stackdocker stack ps minha_stackdocker service lsdocker service logs minha_stack_traefik -fdocker service logs minha_stack_portainer -f✅ Verifique se o Traefik está respondendo
Acesse seu domínio configurado no Traefik:
curl -v http://SEU_DOMINIO/✅ Acesse o Portainer
Abra o navegador e acesse:
https://portainer.SEU_DOMINIO/
Se conseguir visualizar a interface do Portainer, a configuração está correta! 🎉
✅ Testar comunicação entre containers
docker exec -it $(docker ps --filter name=traefik -q) sh -c "ping portainer"Se responder, a rede overlay está funcionando corretamente!
Se precisar atualizar a configuração:
docker stack rm minha_stackdocker stack deploy -c docker-compose.yml minha_stack- Volumes no Swarm: O Swarm não acessa diretórios do host diretamente. Portanto, os volumes de configuração do Traefik foram corrigidos para
bind mountscorretamente. - Permissões do
acme.json: O arquivo de certificadosacme.jsondeve ter permissão restrita para que o Traefik possa acessá-lo. Execute:chmod 600 /home/docker/traefik/config/acme.json
- Modo Global para Traefik: O Traefik é implantado em modo global para garantir que ele esteja presente em todos os nós
manager. - Modo Replicado para Portainer: O Portainer é implantado como um serviço replicado, com uma única instância rodando no nó
manager. - Correção da rede no Traefik: No
traefik.toml, a rede foi ajustada paranetwork_publicpara garantir que os serviços sejam detectados corretamente. - Ajuste da ACME Challenge: Se necessário, use
httpChallengepara evitar falhas na geração de certificados em ambiente local:[certificatesResolvers.lets-encrypt.acme.httpChallenge] entryPoint = "web"
- Correção da porta do
hello-world-webapp: O container usa a porta80por padrão, então foi ajustado notraefik.tomlpara refletir isso. - Correção da política de reinício no Swarm:
restart: alwaysfoi substituído pordeploy.restart_policy.condition: anypara compatibilidade com o Swarm.
Agora seu ambiente está pronto para rodar no modo Swarm com Traefik e Portainer! 🚀🔥