traefik/README.md
2020-09-07 19:24:17 -03:00

123 lines
3.3 KiB
Markdown

# Router Traefik para entorno Docker local
Traefik es un front-end que publica los servicios que tenemos
corriendo localmente en 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)
* `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://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 fácilmente 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-SERVICIO.lndo.site
La selección de `NOMBRE-SERVICIO` 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.
## Particularidades
A la hora de configurar un nuevo servicio hay que tener en cuenta las
siguientes particularidades.
### 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 (la primera
instrucción EXPOSE dentro del Dockerfile). De ser necesario, se puede
personalizar este valor configurando el servicio de la siguiente
manera:
services:
app:
image: ...
# ...
labels:
traefik.http.services.CONTAINER.loadbalancer.server.port=PUERTO
* `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 de un container
Para setear 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`)
### Path donde atiende un servicio
Si quiero que mi aplicación atienda en un path diferente de / debo
agregar la opción PathPrefix a la regla de ruteo:
services:
app:
image: ...
# ...
labels:
traefik.http.routers.CONTAINER.rule=Host(`miservicio.lndo.tite`) && PathPrefix(`/path/app`)