Cómo enrutar el tráfico a contenedores Docker con el proxy inverso de Traefik

Traefik es un proxy inverso y equilibrador de carga líder para operaciones nativas en la nube y cargas de trabajo en contenedores. Funciona como un enrutador de borde que publica sus servicios en Internet.

Traefik enruta las solicitudes a sus contenedores haciendo coincidir los atributos de la solicitud, como el dominio, la URL y el puerto. El proxy incorpora detección automática de servicios para que pueda agregar nuevos contenedores en tiempo real, sin reiniciar el servicio Traefik.

En esta guía, armaremos una distribución simple de Traefik v2 que publicará múltiples contenedores Docker. Esto le permite utilizar una instalación de Docker para proporcionar varios servicios en el mismo puerto, como una aplicación web, una API y un panel de administración.

Índice de contenidos
  1. Para comenzar
  2. A partir de Traefik
  3. tráfico de ruta
  4. Agregar SSL
  5. Usando el tablero
  6. Conclusión

Para comenzar

Es más fácil implementar Traefik usando su propia imagen de Docker. Supongamos que está ejecutando Traefik con Docker durante el resto de esta guía. Los binarios de un solo archivo están disponibles como una opción alternativa si prefiere que Traefik esté fuera de la instalación de Docker.

Debe crear un archivo de configuración antes de poder comenzar a usar Traefik. Agregue el siguiente contenido aa traefik.toml archivo - explicaremos lo que hace a continuación:

[entryPoints]
  [entryPoints.http]
      address = ":80"
      [entryPoints.http.http.redirections.entryPoint]
          to = "https"
          scheme = "https"
  [entryPoints.https]
      address = ":443"
 
[providers]
  [providers.docker]
    network = "traefik"

Este archivo de configuración configura Traefik con dos "puntos de entrada". Los puntos de entrada describen cómo llegan las solicitudes al servicio Traefik. Los puntos de entrada HTTP y HTTPS se crean para escuchar en los puertos 80 y 443 respectivamente. En el caso de una solicitud HTTP, se usa una regla de redirección para reenviarla al https punto de entrada en su lugar. Elimine la sección de redirección si desea poder servir contenido a través de HTTP simple.

La sección "proveedor" configura las fuentes que definen sus rutas de red. Los proveedores son simplemente componentes de infraestructura que pueden enviar instrucciones de enrutamiento a Traefik. Si lo desea, puede escribir un punto final de API HTTP personalizado para definir sus rutas.

En este ejemplo, lo estamos simplificando y usando el docker proveedor. Esto supervisa los contenedores de Docker que se ejecutan en su host. Cuando aparece un nuevo contenedor con etiquetas específicas de Traefik, esos valores se utilizarán para establecer una ruta al contenedor. Los contenedores deberán estar conectados a la traefik Docker network para que esto funcione, ya que esa es la red especificada en el archivo de configuración. Crea la red ahora:

docker network create traefik

A partir de Traefik

¡Ya está listo para iniciar Traefik! Implemente un nuevo contenedor con la imagen de Traefik. Vincule los puertos 80 y 443 a su host, lo que permite que Traefik escuche las solicitudes entrantes. También debe unir el contenedor al traefik red previamente creada.

Monte el socket Docker de su host en el contenedor Traefik con el -v bandera. Esto le da a Traefik la capacidad de acceder a otros contenedores que se ejecutan en su host, lo que permite la detección automática de rutas a través del docker proveedor establecido en el archivo de configuración. El archivo de configuración en sí está montado en /traefik.toml dentro del contenedor Traefik.

docker run -d 
  -p 80:80 
  -p 443:443 
  -v $PWD/traefik.toml:/traefik.toml 
  -v /var/run/docker.sock:/var/run/docker.sock 
  --name traefik 
  --network traefik 
  traefik:2.6

Luego inicie un par de contenedores para verificar que Traefik funciona:

docker run -d 
  --label traefik.http.routers.apache.rule=Host(`apache.example.com`) 
  --name apache 
  --network traefik 
  httpd:latest

docker run -d 
  --label traefik.http.routers.nginx.rule=Host(`nginx.example.com`) 
  --name nginx 
  --network traefik 
  nginx:latest

Asegúrese de haber agregado los registros DNS para apache.example.com Y nginx.example.com ese mapa a su host Traefik. Debería poder visitar esos dominios en su navegador para ver las páginas de inicio predeterminadas de Apache y NGINX, respectivamente. Los dos contenedores están conectados a la red Traefik; su traefik.http.routers las etiquetas establecen rutas base que coinciden con las solicitudes entrantes en función del valor de las suyas Host título.

tráfico de ruta

Traefik admite varios "emparejadores" para enrutar su tráfico. Usamos el comparador de host anterior, pero también puede enrutar a través del método HTTP, encabezados, URI, dirección IP y parámetros de cadena de consulta. Agregue más comparadores a sus contenedores para crear reglas de enrutamiento más complejas.

Traefik también admite middleware que le permite modificar la solicitud antes de que llegue a sus servicios. Es posible que desee agregar un prefijo, ajustar encabezados o aplicar autenticación básica a nivel de proxy. Aquí hay un ejemplo de uso Headers middleware para agregar extra X-Proxied-By encabezado de solicitud:

docker run -d 
  --label traefik.http.routers.nginx.rule=Host(`nginx.example.com`) 
  --label traefik.http.middlewares.demo.headers.customrequestheaders.X-Proxied-By=traefik
  --name nginx 
  --network traefik 
  nginx:latest

Traefik dirige el tráfico a los puertos expuestos de sus contenedores. Puede especificar un puerto diferente configurando el traefik.http.services.<demo-service>.loadbalancer.server.port=8080 etiqueta.

Agregar SSL

A continuación, debe agregar SSL para asegurarse de que su tráfico sea completamente seguro. Traefik incluye la integración de Let's Encrypt, por lo que la usaremos ahora para automatizar la generación de certificados.

Añade la siguiente sección a la tuya traefik.toml Archivo:

[certificatesResolvers.lets-encrypt.acme]
  email = "[email protected]"
  storage = "/acme.json"
  [certificatesResolvers.lets-encrypt.acme.tlsChallenge]

Esto configura Traefik para usar el proveedor Let's Encrypt ACME al resolver solicitudes de certificados. Asegúrese de reemplazar la dirección de correo electrónico con la suya para recibir los recordatorios de caducidad del certificado enviados por Let's Encrypt. El tlsChallenge la sección define cómo se lleva a cabo la verificación de la certificación; si lo deja en blanco, utilizará el flujo predeterminado para servir un archivo único que Let's Encrypt solicitará y validará al emitir el certificado.

Reinicie o reemplace su contenedor Traefik para aplicar la nueva configuración. También debe montar un nuevo archivo en /acme.json dentro del contenedor: Traefik lo usará para almacenar certificados.

docker run -d 
  -p 80:80 
  -p 443:443 
  -v $PWD/acme.json:/acme.json 
  -v $PWD/traefik.toml:/traefik.toml 
  -v /var/run/docker.sock:/var/run/docker.sock 
  --name traefik 
  --network traefik 
  traefik:2.6

Usando el tablero

Traefik incluye una interfaz de usuario web que ofrece una vista gráfica de los puntos finales, proveedores y servicios (contenedores) activos en la implementación. Puede exponer la interfaz de usuario estableciendo una ruta para ella en el archivo de configuración.

Primero edite su existente traefik.toml con la siguiente sección:

[api]
  dashboard = true
 
[providers.file]
  filename = "/traefik_dashboard.toml"

Siguiente crear traefik_dashboard.toml con el siguiente contenido:

[http.middleware.dashboard_auth.basicAuth]
  users = [
    "admin:$123..."
  ]
 
[http.routers.api]
  rule = "Host(`traefik.example.com`)"
  entrypoints = ["https"]
  middlewares = ["dashboard_auth"]
  service = "[email protected]"
  [http.routers.api.tls]
    certResolver = "lets-encrypt"

El nuevo archivo es necesario como Traefik ya que no admite configuración "dinámica" (servicios y enrutadores) junto con valores "estáticos" en su traefik.toml. El archivo de configuración del tablero define manualmente una ruta asignada traefik.example.com al servicio de la interfaz de usuario web interna. El providers.file línea añadida a traefik.toml registrar la nueva definición de ruta con el file proveedor.

Usar htpasswd para generar un conjunto de credenciales de autenticación básica HTTP. Agregue la cadena generada a users matriz en dashboard_auth software intermedio. Deberá usar este nombre de usuario y contraseña para iniciar sesión en el tablero.

sudo apt install apache2-utils
htpasswd -nb admin your_password

# Outputs admin:$123...

Ahora reinicie Traefik con su configuración actualizada, recordando montar la nueva traefik_dashboard.toml también archivo:

docker run -d 
  -p 80:80 
  -p 443:443 
  -v $PWD/acme.json:/acme.json 
  -v $PWD/traefik.toml:/traefik.toml 
  -v $PWD/traefik_dashboard.toml:/traefik_dashboard.toml 
  -v /var/run/docker.sock:/var/run/docker.sock 
  --name traefik 
  --network traefik 
  traefik:2.6

Debería poder acceder al tablero yendo a traefik.example.com en tu navegador. Si no desea exponer la interfaz de usuario web como una ruta y siempre iniciará sesión desde su computadora local, puede publicar el puerto 8080 en su lugar en su contenedor Traefik. Edita tu traefik.toml archivo con la siguiente sección:

[api]
  dashboard = true
  insecure = true
docker run -d 
  -p 8080:8080 
  -p 80:80 
  -p 443:443 
  -v $PWD/acme.json:/acme.json 
  -v $PWD/traefik.toml:/traefik.toml 
  -v /var/run/docker.sock:/var/run/docker.sock 
  --name traefik 
  --network traefik 
  traefik:2.6

Esto le permitirá acceder al tablero a través de http://localhost:8080. Este enfoque no debe usarse en entornos de producción seguros, pero le permite configurar experimentos locales más rápido.

Conclusión

Traefik es una solución de proxy inverso versátil para sus contenedores. En este artículo, hemos cubierto solo las características más básicas. Además del uso básico con Docker, Traefik también funciona con las principales soluciones de orquestación de contenedores, incluidos Kubernetes, Docker Swarm y Mesos.

Traefik proporciona una API REST y métricas en formatos que incluyen Prometheus, InfluxDB, Datadog y Statsd. Estas capacidades le permiten automatizar e instrumentar implementaciones de Traefik junto con otros componentes de infraestructura en su pila. Es una forma ideal de publicar cargas de trabajo en contenedores en todo el mundo sin usar una solución de orquestación completa.

Descubre más contenido

Subir Change privacy settings