Docker Swarm + Traefik 2.2

Configuración de Docker Swarm, el archivo traefik-stack.yaml tiene la configuaración básica necesaria para hacer funcionar al proxy reverso, y un ejemplo con un servicio sonso en whoami-stack.yaml.

version: '3'
services:
reverse-proxy:
image: traefik:v2.2
command:
- --api.insecure=true
- --api.dashboard=true
- --providers.docker=true
- --providers.docker.swarmMode=true
- --providers.docker.exposedbydefault=false
- --providers.docker.network=proxy
- --entrypoints.http.address=:80
- --entrypoints.https.address=:443
ports:
# The HTTP port
- "80:80"
- "443:443"
volumes:
# So that Traefik can listen to the Docker events
- /var/run/docker.sock:/var/run/docker.sock
networks:
- proxy
deploy:
placement:
constraints:
- node.role == manager
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`dashboard.traefik.localhost`)"
- "traefik.http.routers.api.service=api@internal"
- "traefik.http.routers.api.entrypoints=http"
- "traefik.http.services.api.loadbalancer.server.port=80"
networks:
proxy:
external: true
version: '3'
services:
whoami:
# A container that exposes an API to show its IP address
image: containous/whoami
networks:
- proxy
deploy:
labels:
- "traefik.http.routers.whoami.rule=Host(`whoami.localhost`)"
- "traefik.enable=true"
- "traefik.http.routers.whoami.entrypoints=http"
- "traefik.http.services.whoami.loadbalancer.server.port=80"
networks:
proxy:
external: true

Teniendo los archivos de configuración listos, debemos ejecutar los siguientes comandos para levantar el cluster.

Ahora expliquemos un poco…

Como habran notado la magia para publicar servicios realmente esta en la siguiente sección, en los labels que le pongo al servicio dentro de deploy:

En la linea "traefik.http.routers.whoami.rule=Host(whoami.localhost)" lo que hacemos decirle a que URL va a responder.

En la linea "traefik.enable=true" le informamos a Traefik que nos interesa publicar este servicio. Esto es necesario ya que en la configuración de Traefik pusimos de que no queremos que tome todos los servicios publicados por default.

Ahora cuando dice "traefik.http.routers.whoami.entrypoints=http" le estamos diciendo que debe escuchar el puerto 80 (lo configuramos en el archivo traefik-stack.yaml:16) en el host y por último "traefik.http.services.whoami.loadbalancer.server.port=80" nos dice que puerto debemos mapear del contenedor/servicio.