Cómo instalar WordPress con Docker Compose

WordPress es la plataforma de blogs más popular del mundo. Hay muchas formas de instalar WordPress, incluyendo comandos de Shell, instalación manual utilizando los scripts, o utilizando un instalador web que proporcionan los alojamientos web más populares. Ejecutar WordPress implica instalar una pila LAMP (Linux, Apache, MySQL y PHP) o LEMP (Linux, Nginx, MySQL y PHP).

Este tutorial te enseñará a instalar WordPress utilizando Docker/Docker Compose. Utilizando Docker, el proceso de instalación de la pila preferida es mucho más sencillo. Puedes utilizar la misma configuración para instalar WordPress rápidamente en varios servidores. También instalaremos la herramienta phpMyAdmin para gestionar bases de datos junto con el servidor proxy Nginx para servir el sitio mediante SSL.

Requisitos previos

  • Un servidor Linux con un usuario no root que tenga privilegios sudo. Estamos utilizando un servidor con Ubuntu 22.04 para nuestro tutorial.
  • Un nombre de dominio completo (FQDN) que apunte a tu servidor. Para nuestro propósito, utilizaremos example.com como nombre de dominio para el sitio de WordPress y phpmyadmin.example.com para el sitio web de phpMyAdmin.
  • Asegúrate de que todo está actualizado.
    $ sudo apt update
    
  • Instala los paquetes de utilidades básicas. Es posible que algunos de ellos ya estén instalados.
    $ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
    

Paso 1 – Configurar el cortafuegos

El primer paso es configurar el cortafuegos. Ubuntu viene con ufw (Uncomplicated Firewall) por defecto.

Comprueba si el cortafuegos se está ejecutando.

$ sudo ufw status

Deberías obtener la siguiente salida.

Status: inactive

Permite el puerto SSH para que el cortafuegos no rompa la conexión actual al activarlo.

$ sudo ufw allow OpenSSH

Permite también los puertos HTTP y HTTPS.

$ sudo ufw allow http
$ sudo ufw allow https

Habilita el cortafuegos

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Comprueba de nuevo el estado del cortafuegos.

$ sudo ufw status

Deberías ver un resultado similar.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443                        ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)

Paso 2 – Instala Docker y Docker Compose

Ubuntu 22.04 incluye una versión antigua de Docker. Para instalar la última versión, importa primero la clave GPG de Docker.

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Crea un archivo de repositorio de Docker.

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Actualiza la lista de repositorios del sistema.

$ sudo apt update

Instala la última versión de Docker.

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Comprueba que se está ejecutando.

$ sudo systemctl status docker
? docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-01-09 13:19:16 UTC; 9s ago
TriggeredBy: ? docker.socket
       Docs: https://docs.docker.com
   Main PID: 1863 (dockerd)
      Tasks: 7
     Memory: 20.5M
        CPU: 278ms
     CGroup: /system.slice/docker.service
             ??1863 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Por defecto, Docker requiere privilegios de root. Si quieres evitar utilizar sudo cada vez que ejecutes el comando docker, añade tu nombre de usuario al grupo docker.

$ sudo usermod -aG docker $(whoami)

Tendrás que salir del servidor y volver a entrar como el mismo usuario para activar este cambio o utilizar el siguiente comando.

$ su - ${USER}

Confirma que tu usuario se ha añadido al grupo Docker.

$ groups
navjot wheel docker

Paso 3 – Crear el archivo Docker Compose para WordPress

Crea un directorio para la configuración de WordPress.

$ mkdir wordpress

Cambia al directorio.

$ cd wordpress

Crea y abre el archivo Docker compose para editarlo.

$ nano docker-compose.yml

Pega en él el siguiente código.

version: '3.9'

services:
  wp:
    image: wordpress:latest
    container_name: wordpress-app
    restart: unless-stopped
    expose:
      - 8080
    volumes:
      - ./config/php.conf.ini:/usr/local/etc/php/conf.d/conf.ini
      - ./wp-app:/var/www/html
      #- ./plugin-name/trunk/:/var/www/html/wp-content/plugins/plugin-name # Plugin development
      #- ./theme-name/trunk/:/var/www/html/wp-content/themes/theme-name # Theme development
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: "${DB_NAME}"
      WORDPRESS_DB_USER: "${DB_USER_NAME}"
      WORDPRESS_DB_PASSWORD: "${DB_USER_PASSWORD}"
      VIRTUAL_HOST: example.com
      LETSENCRYPT_HOST: example.com
    depends_on:
      - db
    links:
      - db

  wpcli:
    image: wordpress:cli
    container_name: wpcli_app
    volumes:
      - ./config/php.conf.ini:/usr/local/etc/php/conf.d/conf.ini
      - ./wp-app:/var/www/html
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: "${DB_NAME}"
      WORDPRESS_DB_USER: "${DB_USER_NAME}"
      WORDPRESS_DB_PASSWORD: "${DB_USER_PASSWORD}"
    depends_on:
      - db
      - wp

  pma:
    image: phpmyadmin/phpmyadmin
    container_name: pma
    restart: unless-stopped
    environment:
      # https://docs.phpmyadmin.net/en/latest/setup.html#docker-environment-variables
      PMA_HOST: db
      PMA_PORT: 3306
      MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
      UPLOAD_LIMIT: 50M
      VIRTUAL_HOST: phpmyadmin.example.com
      LETSENCRYPT_HOST: phpmyadmin.example.com
    expose:
      - 8081
    links:
      - db:db

  db:
    image: mysql:latest
    container_name: wordpressdb
    restart: unless-stopped
    command: [
        '--default_authentication_plugin=mysql_native_password',
        '--character-set-server=utf8mb4',
        '--collation-server=utf8mb4_unicode_ci'
    ]
    volumes:
      - ./wp-data:/docker-entrypoint-initdb.d
      - db_data:/var/lib/mysql
    environment:
      MYSQL_DATABASE: "${DB_NAME}"
      MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
      MYSQL_USER: "${DB_USER_NAME}"
      MYSQL_PASSWORD: "${DB_USER_PASSWORD}"

volumes:
  db_data:

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Vamos a extraer dos imágenes de WordPress. Una es para el sitio web y la otra es para la herramienta WP-CLI. Ambas imágenes dependen de la imagen docker MySQL 8.0. Aquí establecemos las variables de entorno para las credenciales de la Base de Datos. Hemos creado dos volúmenes para ambos contenedores, uno de los cuales apunta a los archivos públicos del sitio de WordPress y el segundo apunta a la ubicación personalizada PHP.ini. También hemos definido las variables de entorno para el dominio del host virtual Nginx y el dominio Let’s encrypt SSL para el sitio de WordPress.

Puedes añadir más variables de entorno y añadir datos personalizados de wp-config.php al archivo Docker. Puedes obtener información sobre las variables de entorno adicionales en la página DockerHub de WordPress.

La siguiente imagen es para phpMyAdmin, que depende de la misma imagen MySQL y se conecta a ella utilizando la contraseña de root. Tiene un límite de carga de 50MB. Puedes cambiarlo según tus necesidades y el tamaño de tu base de datos. Al igual que con el sitio de WordPress, hemos definido el dominio de host virtual Nginx y el nombre de dominio Let’s encrypt SSL para el sitio phpMyAdmin.

La última imagen es para la base de datos MySQL. Le hemos pasado algunos comandos para establecer el método de autenticación por defecto y el juego de caracteres. También hemos creado un par de volúmenes para almacenar los datos. También hemos configurado variables de entorno para las credenciales de la base de datos.

El siguiente paso es crear el archivo de entorno para las variables utilizadas en el archivo de composición. Crea y abre el archivo de entorno para editarlo.

$ sudo nano .env

Pega en él el siguiente código.

DB_NAME=wordpress
DB_USER_NAME=username
DB_USER_PASSWORD=userpassword
DB_ROOT_PASSWORD=password

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida. Sustituye las variables por el nombre de usuario y la contraseña de tu elección.

Puedes personalizar la configuración PHP utilizando un archivo php.ini personalizado.

Crea una carpeta para la configuración PHP.

$ mkdir config

Crea y abre el archivo php.conf.ini para editarlo.

$ nano config/php.conf.ini

Pega en él el siguiente código. Ajusta los valores según tus necesidades. El límite de subida para el contenedor PhpMyadmin es independiente de los valores que utilices en este archivo.

file_uploads = On
memory_limit = 500M
upload_max_filesize = 30M
post_max_size = 30M
max_execution_time = 600

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Paso 4 – Actualizar Docker Compose para Nginx

Crea el directorio para la configuración de Nginx.

$ mkdir nginx

Crea un directorio para los hosts virtuales dentro de ese directorio.

$ mkdir nginx/vhost

Crea y abre el nginx/vhost/wordpress.example.com para editarlo.

$ nano nginx/vhost/wordpress.example.com

Pega en él el siguiente código.

server_tokens off;
client_max_body_size 30m;

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Haz lo mismo con el archivo nginx/vhost/phpmyadmin.example.com.

$ nano nginx/vhost/phpmyadmin.example.com

Pega en él el siguiente código.

server_tokens off;
client_max_body_size 50m;

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Abre de nuevo el archivo docker compose.

$ nano docker-compose.yml

Pega el siguiente código antes de la línea volumes: db_data:.

nginx:
    container_name: nginx
    image: nginxproxy/nginx-proxy
    restart: unless-stopped
    ports:
        - 80:80
        - 443:443
    volumes:
        - /var/run/docker.sock:/tmp/docker.sock:ro
        - ./nginx/html:/usr/share/nginx/html
        - ./nginx/certs:/etc/nginx/certs
        - ./nginx/vhost:/etc/nginx/vhost.d
    logging:
        options:
            max-size: "10m"
            max-file: "3"

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

En el código anterior, extraemos la imagen Docker del proxy Nginx y exponemos los puertos 80 y 443 al contenedor anfitrión que se utilizará para conectarse al mundo exterior. También hemos creado volúmenes para la página HTML de Nginx, un directorio donde se almacenarán todos los certificados SSL y el directorio para los hosts virtuales, que es lo que hemos utilizado anteriormente para añadir configuración adicional de nginx. Aquí hemos configurado el tamaño de subida de archivos para los sitios WordPress y phpMyAdmin. El nombre de dominio de los sitios se elige a partir de las variables de entorno que definimos en el paso anterior.

Paso 5 – Actualiza Docker Compose para SSL

Abre el archivo docker compose para editarlo.

$ nano docker-compose.yml

Pega el siguiente código antes de la línea volumes: db_data:.

acme-companion:
    container_name: acme-companion
    image: nginxproxy/acme-companion
    restart: unless-stopped
    volumes_from:
        - nginx
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock
        - ./nginx/acme:/etc/acme.sh
    environment:
        DEFAULT_EMAIL: [email protected]

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Aquí estamos extrayendo la imagen Docker Acme companion que funciona junto con el proxy Nginx. Extrae los volúmenes del contenedor Nginx. También definimos un volumen para la herramienta acme.sh que almacena toda la configuración relativa a Let’s encrypt SSL. Y por último, definimos una variable de entorno para registrar el certificado SSL con Let’s Encrypt.

Paso 6 – Iniciar e instalar WordPress

Ahora que todos nuestros archivos de configuración están completos, es el momento de iniciar y lanzar los contenedores.

$ docker compose up -d

Espera un par de minutos y comprueba el estado de los contenedores.

$ docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED          STATUS          PORTS                                                                      NAMES
c1e8a9b5169d   nginxproxy/acme-companion   "/bin/bash /app/entr…"   14 seconds ago   Up 7 seconds                                                                               acme-companion
8a37c78ff790   wordpress:latest            "docker-entrypoint.s…"   14 seconds ago   Up 7 seconds    80/tcp, 8080/tcp                                                           wordpress-app
4f9c777c97c2   phpmyadmin/phpmyadmin       "/docker-entrypoint.…"   14 seconds ago   Up 7 seconds    80/tcp, 8081/tcp                                                           pma
1b1dede46b07   nginxproxy/nginx-proxy      "/app/docker-entrypo…"   14 seconds ago   Up 11 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   nginx
b9cf64a2f4a3   mysql:latest                "docker-entrypoint.s…"   14 seconds ago   Up 11 seconds   3306/tcp, 33060/tcp                                                        wordpressdb

Abre la URL https://example.com para iniciar el instalador de WordPress.

Seleccionar idioma del instalador de WordPress

Selecciona tu idioma y pulsa el botón Continuar para pasar a la página siguiente.

Detalles del sitio del instalador de WordPress

Rellena los datos del sitio, elige tu nombre de usuario, contraseña y dirección de correo electrónico y haz clic en el botón Instalar WordPress para iniciar la instalación.

Instalación correcta de WordPress

Accederás a la página de éxito de la instalación. Haz clic en el botón Iniciar sesión para acceder a la página de inicio de sesión.

Página de inicio de sesión de WordPress

Introduce tus datos de acceso y haz clic en el botón Iniciar sesión para abrir el panel de WordPress.

Panel de WordPress

Ya puedes empezar a utilizar WordPress.

Paso 7 – Acceder a PhpMyAdmin

Puedes acceder a phpMyAdmin a través de la URL https://phpmyadmin.example.com.

Página de inicio de sesión de phpMyAdmin

Introduce root como nombre de usuario y la contraseña de root y haz clic en Iniciar sesión para abrir el panel de control.

Panel de phpMyAdmin

Ya puedes empezar a utilizar phpMyAdmin.

Paso 8 – Acceder a WP-CLI

Puedes acceder al WP-CLI utilizando el siguiente comando.

$ docker compose run --rm wpcli cli version

Obtendrás la siguiente salida.

[+] Running 2/0
 ? Container wordpressdb    Running                                                                                0.0s
 ? Container wordpress-app  Running                                                                                0.0s
WP-CLI 2.7.1

Para evitar escribir un comando tan largo cada vez, podemos utilizar la función de alias de Linux.

$ alias wp="docker compose -f ~/wordpress/docker-compose.yml run --rm wpcli"

Ahora puedes escribir el siguiente comando desde cualquier lugar de tu contenedor.

$ wp cli version

Los alias en Linux son temporales. Para que el alias sea permanente, tienes que editar el archivo ~/.bashrc. Ábrelo para editarlo.

$ nano ~/.bashrc

Pega la siguiente línea al final del archivo.

# Custom aliases
alias wp="docker compose -f ~/wordpress/docker-compose.yml run --rm wpcli"

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Abre el archivo para volver a cargar la configuración.

$ source ~/.bashrc

Ya puedes empezar a utilizar WP-CLI.

Paso 9 – Hacer una copia de seguridad de WordPress

Hay varias formas de hacer una copia de seguridad de WordPress. La forma más sencilla es utilizar un plugin. Hay varios plugins disponibles para ello. También puedes utilizar phpMyAdmin para crear una copia de seguridad.

También puedes utilizar la línea de comandos para hacer una copia de seguridad de la base de datos de WordPress. Cambia al directorio de WordPress.

$ cd ~/wordpress

Utiliza el siguiente comando para hacer una copia de seguridad de la base de datos de WordPress. Se te pedirá la contraseña raíz de MySQL.

$ docker compose exec db sh -c "exec mysqldump wordpress -uroot -p" | sudo tee wp-data/data_`date +%d-%m-%Y"_"%H_%M_%S`.sql >/dev/null
Enter password: password

El comando anterior creará la copia de seguridad SQL en el directorio ~/wordpress/wp-data.

Comprueba el contenido del directorio.

$ ls -al wp-data
total 908
drwxr-xr-x 2 root   root     4096 Jan 11 10:15 ./
drwxrwxr-x 6 navjot navjot   4096 Jan 11 10:05 ../
-rw-r--r-- 1 root   root   919814 Jan 11 10:14 data_11-01-2023_10_14_40.sql

Puedes ver la base de datos respaldada en el directorio. Puedes restaurar esta base de datos utilizando la herramienta phpMyAdmin o utilizando el siguiente comando.

$ docker compose exec db sh -c "exec mysql -uroot -p" < wp-data/data_11-01-2023_10_14_40.sql

Puedes crear una tarea cron para realizar copias de seguridad de la base de datos a intervalos regulares.

Crea el script de copia de seguridad en el directorio /etc/cron.daily y ábrelo para editarlo.

$ sudo nano /etc/cron.daily/wpbackup.sh

Pega en él el siguiente código.

#!/bin/bash
docker compose exec db sh -c "exec mysqldump wordpress -uroot -p" | tee wp-data/data_`date +%d-%m-%Y"_"%H_%M_%S`.sql >/dev/null

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Haz que el script sea ejecutable.

$ sudo chmod +x /etc/cron.daily/wpbackup.sh

Ahora, se realizará una copia de seguridad diaria de tu base de datos.

Paso 10 – Actualizar WordPress

La forma más sencilla de actualizar WordPress es utilizar el actualizador incorporado. También puedes actualizarlo utilizando Docker. El primer paso es hacer una copia de seguridad de la base de datos de WordPress utilizando el comando del paso 9.

A continuación, cambia al directorio

$ cd ~/wordpress

Detén los contenedores.

$ docker compose down --remove-orphans

Extrae las últimas imágenes de contenedor.

$ docker compose pull

Haz los cambios que quieras en docker-compose.yml.

Reinicia los contenedores de WordPress.

$ docker compose up -d

Conclusión

Con esto concluye nuestro tutorial sobre la instalación de WordPress utilizando Docker Compose, phpMyAdmin y WP-CLI. Si tienes alguna pregunta, publícala en los comentarios a continuación.

También te podría gustar...