2020-09-07 10:28:05 -03:00
2020-09-07 17:45:11 -03:00

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 y Docker Compose instalados. En https://servicios.unl.edu.ar/gitlab/recursos/docker se encuentra una receta Ansible para configurar estas herramientas en la PC de desarrollo.

  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.

Cambiar dominio de un container

Para cambiar el dominio donde atiende un servicio, editar el servicio correspondiente en docker-compose.yml:

services:
  app:
    image: ...
    # ...
    labels:
      traefik.http.routers.CONTAINER.rule=Host(`miservicio.lndo.tite`)

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 miservicio.lndo.site, setear en API1 la label:

traefik.http.routers.API1.rule=Host(`miservicio.lndo.site`) && PathPrefix(`/api/v2`)

y en WEBAPP:

traefik.http.routers.API1.rule=Host(`miservicio.lndo.site`)
Description
Traefik service for exposing local containers.
Readme 26 KiB