feat: commit inicial

This commit is contained in:
Mauro Torrez 2020-09-07 10:28:05 -03:00
commit 5492c4c985
3 changed files with 169 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
*~
\#*
.#*
*.bak

129
README.md Normal file
View File

@ -0,0 +1,129 @@
# 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.
1. Clonar este repo:
```shell
git clone https://servicios.unl.edu.ar/gitlab/recursos/traefik.git
```
1. Ejecutar Traefik:
```shell
cd traefik
docker-compose up -d
```
3. 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:
```yaml
---
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.

36
docker-compose.yml Normal file
View File

@ -0,0 +1,36 @@
---
version: "3.5"
# Configuración del servidor frontend Traefik. Especifica el container
# para Traefik y la red Traefik a la que todas las otras aplicaciones
# se conectan.
#
# USO: docker-compose up -d
services:
traefik:
container_name: traefik
image: traefik:v2.2
restart: unless-stopped
command:
- --providers.docker
- --providers.docker.defaultrule=Host(`{{ trimPrefix `/` .Name }}.lndo.site`)
- --providers.docker.network=traefik
- --api.dashboard=true
- --api.insecure=false
- --entryPoints.web.address=:80
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
ports:
- "80:80"
networks:
- traefik
labels:
- traefik.http.routers.api.rule=Host(`frontend.lndo.site`) || Host(`traefik.lndo.site`)
- traefik.http.routers.api.service=api@internal
- traefik.http.routers.api.middlewares=wl
- traefik.http.middlewares.wl.ipwhitelist.sourcerange=0.0.0.0/0
networks:
traefik:
name: traefik