# 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 Compose instalado. 1. Clonar este repo: ```shell git clone https://servicios.unl.edu.ar/gitlab/recursos/traefik.git ``` 1. Ejecutar Traefik: ```shell 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: ```yaml --- 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.