From 5492c4c98505adb734acad12f7a7dac07fd4da6c Mon Sep 17 00:00:00 2001 From: Mauro Torrez Date: Mon, 7 Sep 2020 10:28:05 -0300 Subject: [PATCH] feat: commit inicial --- .gitignore | 4 ++ README.md | 129 +++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 36 +++++++++++++ 3 files changed, 169 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 docker-compose.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4858447 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*~ +\#* +.#* +*.bak diff --git a/README.md b/README.md new file mode 100644 index 0000000..fa5023f --- /dev/null +++ b/README.md @@ -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. diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..45f72d4 --- /dev/null +++ b/docker-compose.yml @@ -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