123 lines
3.3 KiB
Markdown
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`)
|