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.
-
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`)