feat: commit inicial
This commit is contained in:
commit
5492c4c985
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
*~
|
||||||
|
\#*
|
||||||
|
.#*
|
||||||
|
*.bak
|
129
README.md
Normal file
129
README.md
Normal 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
36
docker-compose.yml
Normal 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
|
Loading…
x
Reference in New Issue
Block a user