Evolucionar a través de la tecnología

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:

# 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:

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:

Traefik: Enrutando nuestro WordPress

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.

Comparte