
Guía Completa de Traefik: Mi Experiencia Configurándolo Paso a Paso
hace 2 meses | 5 min read
Cuando comencé a crear páginas web, utilizaba Apache para servir el contenido, ya que trabajaba con PHP. Más adelante, descubrí Docker y empecé a desplegar mis aplicaciones en contenedores, utilizando Nginx como reverse proxy.
Actualmente, en mi servidor uso Traefik, que en su documentación se define como un Application Proxy. Además, sé que también puede funcionar como balanceador de carga, pero en esta guía me centraré en explicar cómo lo utilizo en mi infraestructura y las ventajas que me ha ofrecido esta herramienta.
Aviso
Para seguir esta guía, hace falta tener instalado docker y el plugin docker compose, además de tener un conocimiento acerca de como funcionan estas tecnologías.
Instalación
Para hacer la instalación, en lo personal me gusta crear un directorio para tener todo organizado, por lo tanto, lo primero que aconsejo hacer es crear un directorio y situarse dentro de el con los siguientes comandos:
mkdir ~/traefik
cd ~/traefik
Como yo uso la configuración de traefik con Docker, entonces sigo los pasos de este link de la documentación https://doc.traefik.io/traefik/getting-started/quick-start/ aunque no lo hago identico, para empezar creo un archivo de docker compose para levantar el servicio:
vi docker-compose.yml
Y añado el siguiente contenido para levantar mi servicio de traefik:
services:
traefik:
image: traefik:v3.3
container_name: traefik
ports:
- "80:80"
- "443:443"
networks:
- traefik-net
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- traefik_ssl_data:/ssl-certs
- /etc/traefik:/etc/traefik
restart: unless-stopped
deploy:
resources:
limits:
cpus: "1.0"
memory: "500M"
volumes:
traefik_ssl_data:
external: true
networks:
traefik-net:
external: true
Cuando se levantan varios servicios con docker compose, este se encarga de crear una red en la cual ya estan conectados todos los servicios que se especifican en ese docker-compose.yml, pero como no voy a agregar todos los servicios que levanto en este archivo de docker compose entonces creo una red y le especifico que es externa agregando la opción de external en true. Un paso que se tiene que hacer antes de lenvatar el servicio de traefik es crear la red que especificamos en el docker-compose.yml además tambien crearemos el volumen de traefik_ssl_data:
docker network create traefik-net
docker volume create traefik_ssl_data
A partir de aquí lo que falta por especificar es el volumen /etc/traefik:/etc/traefik por lo tanto tenemos que crear el directorio y adicional debemos crear el archivo /etc/traefik/traefik.yml que será el que contendrá la configuración de traefik y tambien /etc/traefik/certs/acme.json
sudo mkdir /etc/traefik
sudo mkdir /etc/traefik/certs
sudo touch /etc/traefik/certs/acme.json
sudo chmod 600 /etc/traefik/certs/acme.json
sudo vi /etc/traefik/traefik.yml
La configuración es la siguiente:
global:
checkNewVersion: true
entryPoints:
http:
address: ":80"
http:
redirections:
entryPoint:
to: https
scheme: https
https:
address: ":443"
certificatesResolvers:
letsEncrypt:
acme:
email: myemail@mail.com
storage: /etc/traefik/certs/acme.json
tlsChallenge: {}
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
watch: true
file:
directory: /etc/traefik
watch: true
Para conocer todas las opciones disponibles en el archivo de configuración de Traefik, puedes consultar la documentación oficial en el siguiente enlace: https://doc.traefik.io/traefik/v2.0/reference/static-configuration/file/
En mi caso quisiera destacar lo siguiente:
- En entrypoints especifico los puertos por los cuales traefik recibirá las solicitudes. Además configuro una redirección automatica de todas las peticiones HTTP a HTTPS, así garantizo conexiones seguras.
- En certificatesResolvers hago una configuración que se encarga de gestionar automáticamente los certificados SSL a través de Let's Encrypt. Con esta configuración, todas las aplicaciones que despliegue en contenedores Docker obtendrán un certificado SSL sin intervención manual.
- En providers especifico que quiero usar docker como proveedor de servicios permitiendo que traefik detecte los contenedores y gestione el trafico. Además hay diversos proveedores que se pueden observar en el siguiente link: https://doc.traefik.io/traefik/providers/overview/#supported-providers
Ahora solo queda levantar el servicio de traefik con el siguiente comando:
docker compose up -d
Para poner a prueba el reverse proxy levanto dos servicios uno de apache y otro de nginx, para verificar que funcione se necesita que se configuren los DNS necesarios, en mi caso estoy indicando el dominio con este label -l "traefik.http.routers.nginx.rule=Host(`nginx.joel-uzcategui.com`)", en este ejemplo estoy configurando nginx.joel-uzcategui.com y apache.joel-uzcategui.com pero estos dominios no van a funcionar porque al terminar de escribir esta guía los eliminaré.
docker run -d \
-l "traefik.enable=true" \
-l "traefik.http.routers.nginx.rule=Host(\`nginx.joel-uzcategui.com\`)" \
-l "traefik.http.routers.nginx.service=nginx" \
-l "traefik.http.routers.nginx.tls=true" \
-l "traefik.http.routers.nginx.tls.certResolver=letsEncrypt" \
-l "traefik.http.routers.nginx.entryPoints=https" \
-l "traefik.http.services.nginx.loadbalancer.server.port=80" \
-l "traefik.docker.network=traefik-net" \
--name nginx-container \
--network traefik-net \
nginx
docker run -d \
-l "traefik.enable=true" \
-l "traefik.http.routers.apache.rule=Host(\`apache.joel-uzcategui.com\`)" \
-l "traefik.http.routers.apache.service=apache" \
-l "traefik.http.routers.apache.tls=true" \
-l "traefik.http.routers.apache.tls.certResolver=letsEncrypt" \
-l "traefik.http.routers.apache.entryPoints=https" \
-l "traefik.http.services.apache.loadbalancer.server.port=80" \
-l "traefik.docker.network=traefik-net" \
--name apache-container \
--network traefik-net \
httpd
Explicacion rápida de los labels
- -l "traefik.enable=true": Habilita la integración de este contenedor con Traefik. (Si no agregas esta etiqueta, Traefik ignorará este contenedor)
-
-l "traefik.http.routers.nginx.rule=Host(
nginx.joel-uzcategui.com
)": Define la regla de enrutamiento para que las solicitudes a nginx.joel-uzcategui.com sean manejadas por este router en Traefik. - -l "traefik.http.routers.nginx.service=nginx": Especifica que el router llamado nginx usará el servicio llamado nginx.
- -l "traefik.http.routers.nginx.tls=true": Indica que este router debe usar TLS para habilitar HTTPS.
- -l "traefik.http.routers.nginx.tls.certResolver=letsEncrypt": Define que el certificado SSL debe ser gestionado por Let's Encrypt usando el resolver letsEncrypt.
- -l "traefik.http.routers.nginx.entryPoints=https": Indica que este router usará el entryPoint https.
- -l "traefik.http.services.nginx.loadbalancer.server.port=80": Define que el servicio nginx usará el puerto 80 del contenedor.
- -l "traefik.docker.network=traefik-net": Especifica que este contenedor debe estar conectado a la red Docker traefik-net.
Uso personal
Ahora una vez que esta traefik configurado, el uso que le doy yo es el de simplificar el despliegue de aplicaciones que previamente ya estan dockerizadas, en mi servidor tengo un servicio de jenkins corriendo en el cual yo creo pipelines para el despliegue automático de aplicacion cuando detectan algun cambio en una rama del repositorio del proyecto que especifico yo. Por lo tanto me gusta mucho porque la ventaja que me proporciona traefik es que hago una configuracion de una sola vez y cada vez que quiera desplegar una aplicacion no tengo que escribir una configuracion para un dominio en especifico, mediante los labels de docker, me facilita la configuracion.
Nota
El certificado SSL se genera despues de la primera peticion http que recibe.