traefik/README.md

3.0 KiB

Router Traefik para entorno Docker local

Traefik es un front-end que permite hacer routing HTTP de los servicios que tenemos corriendo localmente en contenedores Docker. Según el dominio solicitado, Traefik determina a qué container pasar la petición.

Ejemplo

Supongamos que tenemos corriendo en la máquina de desarrollo los contenedores:

  • kimkelen (servicio HTTP en puerto 80)
  • peruvia (servicio HTTP en puerto 8080)
  • wordpress (servicio HTTP en puerto 80)

Traefik permite acceder a los contenedores locales en las direcciones

Cualquier dominio *.lndo.site siempre apunta a localhost (127.0.0.1), por lo que no hay que configurar nada en /etc/hosts.

Uso

Requerimiento: tener Docker Compose instalado.

  1. Clonar este repo:

    git clone https://servicios.unl.edu.ar/gitlab/recursos/traefik.git
    
  2. Ejecutar Traefik:

    cd traefik
    docker-compose up -d
    
  3. Listo! Ahora puedo acceder a los containers locales en http://NOMBRE-CONTAINER.lndo.site .

La selección de NOMBRE_CONTAINER sigue una serie de reglas. Para encontrar la URL asignada a un container, ingresar a http://traefik.lndo.site y revisar el listado que aparece.

Gotchas

Conexión a la red de Traefik

Los containers deben estar asociados a la red de Traefik para poder routear el tráfico interno.

  • En Docker Compose se debe marcar la red Traefik como externa, por ejemplo:

    ---
    services:
      # servicio web de wordpress
      wordpress:
        image: wordpress
        # ... etc ...
        networks:
      	- traefik
      	- app
    
      mysql:
        image: mysql
        # ... etc ...
        networks:
      	- app
    
    networks:
      traefik:
        external: true
      app:
    

Puerto a publicar

Traefik usa el primer puerto expuesto por el contenedor. De ser necesario se puede setear en dicho contenedor la label traefik.http.services.CONTAINER.loadbalancer.server.port=PUERTO" para cambiar este comportamiento.

  • CONTAINER es un nombre único para el servicio del contenedor, se recomienda usar el mismo nombre que el container.

  • PUERTO es el puerto en el que el contenedor escucha peticiones HTTP.

Dominio no estándar para un container

Obviamente el dominio que estamos configurando debe resolverse vía DNS al host que ejecuta Traefik.

En docker-compose.yml

Agregar al servicio correspondiente en docker-compose.yml:

# ...
    labels:
	  traefik.http.routers.CONTAINER.rule=Host(`MIDOMINIO.COM`)
# ...

Routear según dominio + path

Si deseo que API1 atienda todas las peticiones /api/v1/ y WEBAPP atienda en cualquier otro path, ambas para un mismo dominio MIDOMINIO.COM, setear en API1 la label:

'traefik.http.routers.API1.rule=Host(`MIDOMINIO.COM`) && PathPrefix(`/api/v2`)'

y en WEBAPP:

'traefik.http.routers.API1.rule=Host(`MIDOMINIO.COM`)'

Recordar usar comillas simple (') en la opción --label si se ejecuta vía CLI.