0

Desplegar WordPress con Docker

Hola a tod@s,

En este post vamos a ver como desplegar wordpress con Docker, desplegaremos dos contenedores Docker para este servicio, uno de ellos será el de MariaDB para la base de datos que vamos a utilizar y el otro el propio de WordPress con la aplicación, este servicio irá desplegado, sobre la misma máquina dónde ya desplegamos un docker con Nginx Proxy Manager, que será el que utilicemos para los certificados SSL.

  • Para empezar, vamos a ver que hemos preparado esta máquina virtual con Ubuntu Server 24.04 LTS, dónde tenemos dos discos, uno de sistema y otro de datos:

  • Como podemos ver, el disco de datos lo hemos montado sobre /opt/docker que es dónde vamos a ubicar todos los contenedores Dockers y sus configuraciones:

  • Nos creamos el registro DNS del tipo CNAME para wordpress apuntando a la máquina que tiene instalado el Docker con el Nginx Proxy Manager, ya que vamos a utilizar nuestro proxy inverso:

  • Verificamos las versiones de Docker instaladas, docker –version, docker compose version:

  • Ahora vamos a crear la estructura de directorios y permisos para los contenedores de MariaDB y WordPress:
  • sudo mkdir -p /opt/docker/wprgs/wprgsdb/data
  • sudo mkdir -p /opt/docker/wprgs/wprgsdb/config
  • sudo mkdir -p /opt/docker/wprgs/wprgsapp/config
  • sudo chmod -R 755 /opt/docker/wprgs/wprgsdb
  • sudo chmod -R 755 /opt/docker/wprgs/wprgsapp

  • Ahora creamos una red personalizada para nuestro proyecto, sudo docker network create —subnet 172.25.3.0/24 –gateway 172.25.3.1 -d bridge wprgs-net, con sudo docker network ls vemos la redes que tenemos configuradas y con sudo docker network inspect wprgs-net, vemos la configuración de la red que hemos creado:

  • Ahora vamos a crearnos los ficheros .env para no dejar credenciales en texto plano en los ficheros docker-compose.yaml que crearemos posteriormente, utilizando para ello variables.
  • Empezaremos con el fichero .env para el contenedor de MariaDB, para ello, nos situamos en cd /opt/docker/wprgs/wprgsdb, y ejecutamos sudo nano .env:

  • Y así definimos el fichero:
  • MYSQL_ROOT_PASSWORD=clave_muy_segura_root_db
  • MYSQL_DATABASE=wprgsdb
  • MYSQL_USER=wprgsuser
  • MYSQL_PASSWORD=clave_muy_segura_db

  • Nos creamos el fichero docker-compose.yaml para el contenedor de MariaDB en la misma ubicación, sudo nano docker-compose.yaml:

  • Este sería el contenido del fichero:

services:

wprgs-db:

image: mariadb:12.2

container_name: wprgs-db

restart: unless-stopped

env_file: .env

environment:

– MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}

– MYSQL_DATABASE=${MYSQL_DATABASE}

– MYSQL_USER=${MYSQL_USER}

– MYSQL_PASSWORD=${MYSQL_PASSWORD}

volumes:

– /opt/docker/wprgs/wprgsdb/data:/var/lib/mysql

– /opt/docker/wprgs/wprgsdb/config:/etc/mysql/conf.d:ro

networks:

– wprgs-net

 

networks:

wprgs-net:

name: wprgs-net

external: true

  • Aquí vemos los ficheros creados:

  • Seguimos con el fichero .env para el contenedor de wordpress app, para ello, nos situamos en cd /opt/docker/wprgs/wprgsapp, y ejecutamos sudo nano .env:

  • Y así definimos el fichero:

WORDPRESS_DB_USER=wprgsuser

WORDPRESS_DB_PASS=clave_muy_segura_db

WORDPRESS_DB_NAME=wprgsdb

  • Nos creamos el fichero docker-compose.yaml para el contenedor de wordpress-app en la misma ubicación, sudo nano docker-compose.yaml:

  • Este sería el contenido del fichero:

services:

wprgs-app:

image: wordpress:6.9.4-php8.5-apache

container_name: wprgs-app

restart: unless-stopped

ports:

– «8081:80»

env_file: .env

environment:

– WORDPRESS_DB_HOST=wprgs-db:3306

– WORDPRESS_DB_USER=${WORDPRESS_DB_USER}

– WORDPRESS_DB_PASSWORD=${WORDPRESS_DB_PASS}

– WORDPRESS_DB_NAME=${WORDPRESS_DB_NAME}

– WORDPRESS_CONFIG_EXTRA=define(‘WP_HOME’,’https://wprgs.ragasys.net’); define(‘WP_SITEURL’,’https://wprgs.ragasys.net’); if (isset($$_SERVER[‘HTTP_X_FORWARDED_PROTO’]) && $$_SERVER[‘HTTP_X_FORWARDED_PROTO’] === ‘https’) { $$_SERVER[‘HTTPS’] = ‘on’; }

volumes:

– /opt/docker/wprgs/wprgsapp/config:/var/www/html

networks:

– wprgs-net  # Para comunicar con la DB

– npm-net    # Para comunicar con Nginx Proxy Manager

 

networks:

wprgs-net:

external: true

npm-net:

external: true

  • Aquí debemos tener en cuenta, que la línea de los puertos 8081:80, la hemos dejado solo para verificar que el servicio se levanta en esos puertos por HTTP, una vez que configuremos nuestro Nginx Proxy Manager para el acceso por HTTPS con los certificados de Let’s Encrypt esta línea la podemos quitar o comentar, y con respecto a la variable WORDPRESS_CONFIG_EXTRA, es para indicarle al wordpress que está detrás de un proxy, también podemos ver que se conecta con la red de Nginx Proxy Manager npm-net, ya qu el acceso será a través de nuesro proxy inverso.
  • Aquí vemos los ficheros creados:

  • Protegemos los archivos .env aplicando estos permisos:
  • sudo chmod 600 /opt/docker/wprgs/wprgsdb/.env
  • sudo chmod 600 /opt/docker/wprgs/wprgapp/.env

  • Ahora, iniciamos primero el contenedor de MariaDB, cd /opt/docker/wprgs/wprgsdb/, sudo docker compose up -d:

  • Iniciamos el contenedor de wprgs-app, cd /opt/docker/wprgs/wprgsapp/, sudo docker compose up -d:

  • Aquí vemos los contenedores levantados, sudo docker ps -a:

  • Ahora accedemos a nuestro portal de Nginx Proxy Manager para crear el host para wordpress.
  • Accedemos a Hosts > Hosts Proxy:

  • Añadir Host Proxy:

  • En la pestaña Detalles:
  • Nombres de Dominio: ragasys.net
  • Esquema: http
  • Nombre de Host/IP de reenvío: wprgs-app
  • Puerto: 80
  • Bloquear Exploits Comunes
  • Soporte de Websockets
  • En la pestaña SSL:
  • Seleccionamos el Certificado SSL que nos interese
  • Marcamos Forzar SSL
  • Guardar

  • Aquí vemos el host creado y conectado:

  • Y como vemos ya tenemos acceso a nuestro wordpress a través de nuestro proxy inverso con Nginx Proxy Manager, ahora nos va a pedir lo típico tras el primer acceso:

  • Introducimos las credenciales y ya estamos dentro de nuestro wordpress, listo para empezar a publicar:

 

Saludos y espero que os resulte de ayuda 😉

Jose Ramon Ramos Gata

Técnico Superior STI

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.