Traefik: Enrutando nuestro WordPress
En el anterior post instalamos docker y docker-compose en una instancia EC2 de Amazon para testear el funcionamiento de Traefik como proxy inverso.
Dejamos corriendo la instalación de Traefik v2.3.6 con una url asegurada mediante certificado SSL Let’s Encrypt.
En este post utilizaremos de nuevo docker y docker-compose para levantar un WordPress que será enrutado a través de Traefik y será éste el encargado de dotarlo de certificado y el enrutamiento necesario. Traefik analizará a través del socket de Docker que le hemos pasado en su configuración que hay un nuevo contenedor en el sistema y a través de las labels de éste le diremos qué url tendrá dicho contenedor y cómo servirlo, en este caso a través de https.
Recordemos que tenemos generado un Wildcard DNS para que todos los subdominios apunten a la IP de nuestra instancia EC2. En este caso, usaremos la url blog.canonigos.me para desplegar el WordPress.
Generando el fichero docker-compose.yml
Vamos a crear un directorio wordpress dentro del home de nuestro usuario y a generar un fichero docker-compose.yml como el siguiente dentro de él:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# wordpress/docker-compose.yml version: '3.7' services: db: image: mariadb container_name: db volumes: - db-data:/var/lib/mysql networks: - default restart: always environment: MYSQL_ROOT_PASSWORD: PasswordSecreta MYSQL_DATABASE: wpdb MYSQL_USER: blog_dbuser MYSQL_PASSWORD: blogdbpassword wordpress: depends_on: - db image: wordpress:latest container_name: wordpress environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_NAME: wpdb WORDPRESS_DB_USER: blog_dbuser WORDPRESS_DB_PASSWORD: blogdbpassword volumes: - ./wp-data:/var/www/html/wp-content networks: - proxy - default restart: always labels: - "traefik.enable=true" - "traefik.docker.network=proxy" - "traefik.http.routers.wordpress-secure.entrypoints=websecure" - "traefik.http.routers.wordpress-secure.rule=Host(`blog.canonigos.me`)" volumes: db-data: name: wp-db-data networks: proxy: external: true |
En este fichero hemos definido dos servicios, uno llamado db que correrá una imagen de MariaDB 10.5 y otro llamado wordpress que es la imagen oficial de WordPress (el tag latest incluye Apache2 + PHP 7.4.13).
Mas allá de configurar contraseñas y dependencias entre los servicios para definir el orden de arranque, son importantes varias cosas:
- El contenedor WordPress tiene configuradas dos redes, la externa del proxy que será la que utilizará Traefik para mandarle el tráfico cuando visitemos el blog y la default por la que se comunicará con el servicio del contenedor db , la base de datos de nuestro WordPress.
- Hemos creado un volumen llamado wp-db-data para albergar los datos del contenedor db , así podremos actualizar la versión de WordPress o reiniciar el servicio sin miedo a perder los datos.
- Las labels de Traefik asignan este servicio al entrypoint websecure (es decir, que irá sobre https) y el Host del que Traefik recogerá las peticiones y las enviará a este contenedor.
De esta forma, queda enrutada que cualquier petición que entre a Traefik con el Host:blog.canonigos.me irá al servicio wordpress de este stack que vamos a levantar.
Arrancando nuestro WordPress
Vamos a arrancar pues este docker-compose con nuestra aplicación:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
admin@ip-10-0-3-96:~/wordpress$ docker-compose up -d Creating network "wordpress_default" with the default driver Creating volume "wp-db-data" with default driver Pulling db (mariadb:)... latest: Pulling from library/mariadb da7391352a9b: Pull complete 14428a6d4bcd: Pull complete 2c2d948710f2: Pull complete 22776aa82430: Pull complete 90e64230d63d: Pull complete f30861f14a10: Pull complete e8e9e6a3da24: Pull complete 420a23f08c41: Pull complete bd73f23de482: Pull complete a8690a3260b7: Pull complete 4202ba90333a: Pull complete a33f860b4aa6: Pull complete Digest: sha256:cdc553f0515a8d41264f0855120874e86761f7c69407b5cfbe49283dc195bea8 Status: Downloaded newer image for mariadb:latest Pulling wordpress (wordpress:latest)... latest: Pulling from library/wordpress 6ec7b7d162b2: Pull complete db606474d60c: Pull complete afb30f0cd8e0: Pull complete 3bb2e8051594: Pull complete 4c761b44e2cc: Pull complete c2199db96575: Pull complete 1b9a9381eea8: Pull complete 50450ffc67ee: Pull complete 4d1e5a768e83: Pull complete 5e8be0d1df16: Pull complete 7a6395859d40: Pull complete 7306499d3dce: Pull complete fa6f0ba15ac6: Pull complete 308a9ead128f: Pull complete 2db781a8732e: Pull complete 63d3161e9e46: Pull complete a08dd591ed8a: Pull complete 931a26282f2a: Pull complete f5c6b405e809: Pull complete caf2bb847f73: Pull complete Digest: sha256:dadd8e9c2ef6dc2fe146cbc5f2edc0ed8ae1026ae252b52f25791be4d7d16600 Status: Downloaded newer image for wordpress:latest Creating wordpress-db ... done Creating wordpress ... done |
Tras esperar un minuto aproximadamente deberíamos poder acceder a la url que hemos definido y que Traefik pasará a nuestro recién creado stack.
Os adjunto capturas del proceso de instalación ya en el navegador:
Qué ha hecho Traefik por nosotros
Traefik nos ha generado un nuevo enrutamiento para nuestra url blog.canonigos.me enlazando este host con nuestro stack de docker-compose recién desplegado:
Además ha generado un nuevo certificado para la url y ha configurado las cabeceras necesarias para que dicho certificado se muestre correctamente:
De esta forma Traefik ha solventado fácilmente muchas partes de la configuración y exposición de nuestra aplicación WordPress así como la segurización de la misma tanto por la capa de certificado como la cabeceras de seguridad.
En próximos posts hablaremos de las capacidades de Traefik como Ingress Controller de Kubernetes.
Esta muy bueno el articulo, mi duda es como hago para tener una instancia mas de wordpress aparte de la que tengo
Hola Seba,
Es bastante simple, te explicamos:
Debes crear una carpeta nueva, por ejemplo
wordpress2
, donde alojaremos una nueva configuración dedocker-compose
.Por ejemplo:
# wordpress2/docker-compose.yml
version: '3.7'
services:
db:
image: mariadb
container_name: db2
volumes:
- db-data-2:/var/lib/mysql
networks:
- default
restart: always
environment:
MYSQL_ROOT_PASSWORD: PasswordSecreta
MYSQL_DATABASE: wpdb
MYSQL_USER: blog_dbuser
MYSQL_PASSWORD: blogdbpassword
wordpress:
depends_on:
- db
image: wordpress:latest
container_name: wordpress2
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wpdb
WORDPRESS_DB_USER: blog_dbuser
WORDPRESS_DB_PASSWORD: blogdbpassword
volumes:
- ./wp-data:/var/www/html/wp-content
networks:
- proxy
- default
restart: always
labels:
- "traefik.enable=true"
- "traefik.docker.network=proxy"
- "traefik.http.routers.wordpress-secure.entrypoints=websecure"
- "traefik.http.routers.wordpress-secure.rule=Host(
blog2.canonigos.me
)volumes:
db-data-2:
name: wp-db-data-2
networks:
proxy:
external: true
Debes prestar especial atención a lo siguiente:
– Los nombres de los contenedores definidos en las claves
container_name
deberán ser únicos, como ves los he cambiado porwordpress2
ydb2
respectivamente para que no colisionen con los del anterior servidor WordPress. Si omites elcontainer_name
, Docker generará un nombre de contenedor relacionado con el nombre de la carpeta donde se aloja el ficherodocker-compose.yml
.– Las etiquetas o labels que interpreta Traefik definidas en el contenedor de WordPress han de tener una nueva configuración de
Host
, en este casoblog2.canonigos.me
que será el hostname que tendrá esta nueva instancia.– Y, por último, los volúmenes definidos para la persistencia de los datos en el fichero
docker-compose.yml
también deben ser nombrados de forma única, en este caso yo le he puestowp-db-data-2
. Es una buena práctica nombrar estos volúmenes con información relacionada al sitio que van a alojar, por ejemploblog2.canonigos-db-data
.Con esto debes poder lanzar dentro de este nuevo directorio
wordpress2
undocker-compose up
y tener una nueva instancia de WordPress funcionando que tendrá su certificado generado automáticamente por Traefik vía Let’s Encrypt, recuerda que el hostname definido dentro de laslabels
que interpreta Traefik tendrá que apuntar también a la misma ip del servidor.Por favor, cuando lo hayas probado cuéntanos si te funciona correctamente 😉
¡Un saludo!
¿Serías tan amable de hacer esto mismo pero con un único dominio y subcarpetas?
Por ejemplo, http://www.midonimio.com/wordpress1 , http://www.midomino.com/wordpress2, etc
Mi proveedor de Internet me facilita un único dominio del tipo:
midominio.ddns.jazztel.es
Y tengo que utilizar subcarpetas en las urls, no tengo la posibilidad de utilizar Wilcard en el DNS.
He probado de todo, ando cerca, pero no acaba de funcionar.
Muchas gracias.
¡Hola!
Ante todo gracias por enviarnos tu consulta y disculpa la tardanza de nuestra respuesta.
En el caso que nos comentas tendrás que utilizar dos características de Traefik. La primera es un Router específico que debes aplicar en la label del contenedor de la instancia
wordpress1
. Algo así cómo:traefik.http.routers.wordpress1.rule=PathPrefix(
/wordpress1{regex:$$|/.*}
)De igual forma, para la aplicación
wordpress2
en su definición de docker-compose.Y después tendrás que utilizar un middleware de tipo
stripprefix
también como label dentro de la definición del contenedor:traefik.http.middlewares.wordpress1-stripprefix.stripprefix.prefixes=/wordpress1
Y de la misma forma para la aplicación
wordpress2
.Tienes más info sobre este router y middleware aquí:
• https://doc.traefik.io/traefik/routing/routers/
• https://doc.traefik.io/traefik/middlewares/http/stripprefix/
¡Esperamos que puedas echarlo a andar! ¡Cuéntanos al respecto!
Un saludo.