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