# 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 * http://kimkelen.lndo.site (80) -> container kimkelen (80) * http://peruvia.lndo.site (80) -> container peruvia (8080) * http://wordpress.lndo.site (80) -> container wordpress (80) 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`)