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.
-
Clonar este repo:
git clone https://servicios.unl.edu.ar/gitlab/recursos/traefik.git -
Ejecutar Traefik:
cd traefik docker-compose up -d -
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.
-
CONTAINERes un nombre único para el servicio del contenedor, se recomienda usar el mismo nombre que el container. -
PUERTOes 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`)