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 yphpmyadmin.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.
Selecciona tu idioma y pulsa el botón Continuar para pasar a la página siguiente.
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.
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.
Introduce tus datos de acceso y haz clic en el botón Iniciar sesión para abrir el 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
.
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.
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.