Traefik en Docker para múltiples entornos de devel

Traefik es un proxy HTTP, desarrollado en Go, OpenSource y que se lleva realmente bien con Docker.

La problematica es la siguiente: Si tienes diferents aplicaciones web en las que quieres desarrollar en local, lo normal es crear un Docker-Compose en cada una de ellas, tener un servidor HTTP como nginx o Apache corriendo, y, claro, lo normal es tenerlos escuchando en el puerto HTTP/HTTPS. Puerto 80 o 443, respectivamente.

Veamos un ejemplo:

Peeeero en tu máquina de MAC/Windows/Linux tan solo puedes tener un daemon escuchando en un mismo puerto a la vez; esto siginifica que solo puedes tener levantada una aplicación a la vez. Cuando acabas de desarrollar, la paras e inicias otra aplicación y desarrollas en la misma.

Proyectos con stacks diferents pero que comparten algo común, el puerto 80!

Estos dos proyectos nunca podrán estar levantados a la vez, si intentan exponer el puerto 80 en la maquina host.

Una posible solución sería que cada proyecto esuche en un puerto HTTP distinto: 80, 81, 82… pero esto es una chapuza que no escala, sobre todo con gran número de proyectos, o con equipos diferentes.

Traefik

Justament Traefik nos permite levantar un servicio que escucha en el puerto 80 (y 443 si queremos SSL) de la máquina host. Los diferentes proyectos que tengamos no expondrán el puerto 80 públicamente, sinó que lo expondrán a través Traefik, y éste redirigirá el tráfico a una aplicación u otra en función de un virtual host. Veamos un ejemplo, donde se aclara todo mas rápido:

Traefik standalone

Por si solo, Traefik no sirve de nada. Cualquier petición que hagamos ahora devolverá un “404 page not found” .

Si ahora levantamos una aplicación, se trata de que ésta se registre automáticamente en Traéfik, con un nombre concreto. En este caso he elegido app.local.

Ahora si hacemos una petición a Traefik por el puerto 80 que está escuchando en la máquina host, con el vhosts app.local, Traefik enrutará dicha petición a la APP1.

Éste proceso se puede repetir el número de veces que queramos, e ir registrando aplicaciones

Si hacemos una petición con Google Chrome, nos lleva a app2.local.

Ejemplo real

Éste es el ejemplo mas tonto que podamos crear. Dos aplicaciones, y el proxy reverso Traefik. Como podéis ver, las configuraciones de traefik se hacen mediante Labels propios de Docker Compose y Traefik es capaz de inspeccionar dichos Labels y extraer la información para configurar los vhosts dinámicamente.

version: '3'

services:
  app1:
    image: nginx
    volumes:
      - ./app1:/usr/share/nginx/html
    labels:
      - "traefik.frontend.entryPoints=http"
      - "traefik.frontend.rule=Host:app1.local"

  app2:
    image: httpd
    volumes:
      - ./app2:/usr/local/apache2/htdocs/
    labels:
      - "traefik.frontend.entryPoints=http"
      - "traefik.frontend.rule=Host:app2.local"

  proxy:
    image: traefik
    command: --api --docker
    ports:
      - "80:80"     # The HTTP port
      - "8080:8080" # The Web UI (enabled by --api)
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    labels:
      - "traefik.port=8080"
      - "traefik.frontend.rule=Host:traefik.local"

Si levantamos con Compose el stack:

Levantamos com “docker-compose up” el stack, se inician los dos servidores web

Podemos hacer curl a Traefik (recordemos que está escuchando en localhost), usando el vhost que hemos definido en los labels:

❯ curl --header "Host: app1.local" localhost
This is the APP 1

~
❯ curl --header "Host: app2.local" localhost
Unsurprisingly, this is the App2

~
❯ curl --header "Host: app3.local" localhost
404 page not found

Como véis el tercer curl falla debido a que Docker no tiene registrado este dominio.

Para que Traefik sea capaz de cargar dinámicamente las diferentes configuraciones de los Labels, es necesario que Traefik tenga acceso al daemon de Docker de la máquina host. Esto lo conseguimos compartiendo el siguiente fichero en los volúmenes de Docker:

      - /var/run/docker.sock:/var/run/docker.sock

La demás parte de la configuración se explica bastante sola, ¿verdad?

Traefik User Interface

Los mas avispados habrán visto que en la configuración de Traefik activamos la UI, y si accedemos a http://localhost:8080 veremos un panel así de chulo:

Panel de administración de Traefik

Éste panel nos ayuda de una forma visual de ver que proyectos tenemos enmarcha.

Conclusión

Traefik ofrece la opción de registrar varios proyectos dinámicamente sin mucha complicación.

Aún así también permite balancear tráfico entre otros backends, no hace falta que se use siempre en Docker, los backends pueden ser máquinas de Vagrant o remotas, permite configuraciones dinámicas complejas (con expresiones regulares por vhosts).

Todo con una documentación extensa, un proyecto con mucha viruta detrás por reciente financiación, y que va ganando cada día mas peso en el mercado.

Yo personalmente no le he encontrado ninguna pega; lo recomiendo.

Nota final

Explicitamente he evitado tocar el tema de DNS en los entornos de desarrollo en éste artículo, puesto que se salen del scope, y he forzado que curl ataque directamente a localhost, definiendo el vhost en la cabecera. Si no quieres tener que hacer esto y poder acceder directamente con Curl o Google Chrome, una posibilidad sea modificar el fichero /etc/hosts o instalar dnsmask, o similar, en local. Quizá haya un artículo en el futuro sobre esto.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *