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

Cualquier dominio *.lndo.site siempre apunta a localhost (127.0.0.1), por lo que no hay que configurar nada en /etc/hosts.

Requerimientos

Se debe tener Docker y Docker Compose instalados. Para instalar estas herramientas de forma fácil, se puede usar la receta Ansible creada para este fin:

git clone https://servicios.unl.edu.ar/gitlab/recursos/docker.git
cd docker
ansible-playbook playbook.yml --ask-become-pass

Más info aquí.

Uso

El servicio Traefik está pensado para ser levantado una vez y quedar corriendo "para siempre" en la PC de desarrollo, ocupando el puerto 80 y rutear automaticamente cualquier servicio Docker que tengamos corriendo.

  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 servicio, ingresar a http://traefik.lndo.site y revisar el listado que aparece.

  4. Para apagar Traefik, ejecutar

     docker-compose down
    

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`)
Description
Traefik service for exposing local containers.
Readme 26 KiB