Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save githubmarau/022cc82dac9f8896d2061a08ef89533d to your computer and use it in GitHub Desktop.

Select an option

Save githubmarau/022cc82dac9f8896d2061a08ef89533d to your computer and use it in GitHub Desktop.
Configuração do Traefik e Portainer no Docker Swarm

🚀 Configuração do Traefik e Portainer no Docker Swarm

Este guia explica como configurar o Traefik e o Portainer no modo Swarm, incluindo o Portainer Agent para acessar volumes.

📌 Pré-requisitos

  • Docker instalado (versão 20+)
  • Docker Swarm inicializado
  • Rede overlay criada

🛠️ Configuração do docker-compose.yml

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: true

🚀 Como Implantar no Swarm

1️⃣ Inicializar o Swarm (se ainda não foi feito)

docker swarm init

2️⃣ Criar a rede overlay (se ainda não existir)

docker network create --driver=overlay network_public

3️⃣ Implantar a stack

docker stack deploy -c docker-compose.yml minha_stack

4️⃣ Verificar se os serviços estão rodando

docker stack ps minha_stack

5️⃣ Listar os serviços ativos

docker service ls

6️⃣ Verificar logs do Traefik

docker service logs minha_stack_traefik -f

7️⃣ Verificar logs do Portainer

docker service logs minha_stack_portainer -f

🔎 Testando se Tudo Funciona

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!


🔄 Como Atualizar a Stack

Se precisar atualizar a configuração:

docker stack rm minha_stack
docker stack deploy -c docker-compose.yml minha_stack

⚠️ Observações Importantes

  • 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 mounts corretamente.
  • Permissões do acme.json: O arquivo de certificados acme.json deve 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 para network_public para garantir que os serviços sejam detectados corretamente.
  • Ajuste da ACME Challenge: Se necessário, use httpChallenge para 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 porta 80 por padrão, então foi ajustado no traefik.toml para refletir isso.
  • Correção da política de reinício no Swarm: restart: always foi substituído por deploy.restart_policy.condition: any para compatibilidade com o Swarm.

Agora seu ambiente está pronto para rodar no modo Swarm com Traefik e Portainer! 🚀🔥

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment