Instalar WordPress en Docker: desarrollo reproducible

Contents

Introducción

En el desarrollo web moderno, garantizar entornos reproducibles y aislados es fundamental para evitar
sorpresas al pasar de un equipo a otro o de desarrollo a producción. Docker se ha convertido en la
tecnología de referencia para contenerizar aplicaciones, proporcionando consistencia, portabilidad
y facilidad de despliegue. En este artículo muy extenso, detallaremos paso a paso cómo instalar
WordPress en Docker utilizando docker-compose, crear un entorno de desarrollo reproducible
y aplicar buenas prácticas para mantener la calidad y seguridad del proyecto.

1. ¿Por qué usar Docker para WordPress

  • Aislamiento: Cada servicio (WordPress, base de datos, phpMyAdmin, etc.) corre en su contenedor.
  • Reproducibilidad: El mismo docker-compose.yml permite reconstruir el entorno en cualquier máquina.
  • Portabilidad: Funciona en Windows, macOS y Linux sin modificaciones.
  • Escalabilidad: Facilita la separación de servicios y el escalado horizontal.
  • Mantenimiento simplificado: Actualizar versiones, cambiar configuraciones o añadir servicios es tan sencillo como
    modificar un archivo YAML.

2. Requisitos previos

  • Docker Engine: Versión 20.10 o superior. Ver documentación: https://docs.docker.com/engine/
  • Docker Compose: Versión 1.29 o superior. Más información: https://docs.docker.com/compose/
  • Conocimientos básicos de Docker: Imágenes, contenedores, volúmenes, redes.
  • Editor de texto: Cualquier IDE o editor (VSCode, Atom, Sublime, etc.).
  • Conexión a Internet: Para descargar imágenes oficiales de Docker Hub.

3. Arquitectura propuesta

Para nuestro entorno de desarrollo reproducible con WordPress usaremos los siguientes contenedores:

  • db: Servicio de base de datos MySQL o MariaDB.
  • wordpress: Servicio de PHP Apache con WordPress instalado.
  • phpmyadmin (opcional): Interfaz web para gestionar la base de datos.

El esquema de comunicación será a través de una red interna de Docker, con volúmenes para persistir
datos y un archivo docker-compose.yml para orquestar todo.

4. Estructura del proyecto

Dentro de tu carpeta de trabajo (por ejemplo, wp-docker/) organiza los siguientes elementos:

  • docker-compose.yml – Define servicios, redes y volúmenes.
  • .env (opcional) – Variables de entorno sensibles como contraseñas.
  • html/ – Directorio donde WordPress montará sus archivos y al que accederemos desde el host.
  • backups/ – Copias de seguridad de base de datos o ficheros.
  • logs/ – Archivos de registro si se desea mapear logs de Apache o PHP.

5. Creación del archivo docker-compose.yml

version: 3.8
services:
  db:
    image: mysql:8.0
    container_name: wp_db
    restart: always
    env_file: .env
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: wp_pass
      MYSQL_ROOT_PASSWORD: root_pass
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - wp_network

  wordpress:
    image: wordpress:latest
    container_name: wp_app
    depends_on:
      - db
    ports:
      - 8080:80
    restart: always
    env_file: .env
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: wp_pass
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - ./html:/var/www/html
    networks:
      - wp_network

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    container_name: wp_phpmyadmin
    depends_on:
      - db
    ports:
      - 9090:80
    restart: always
    environment:
      PMA_HOST: db
      PMA_USER: root
      PMA_PASSWORD: root_pass
    networks:
      - wp_network

volumes:
  db_data:

networks:
  wp_network:
    driver: bridge
    

5.1 Explicación de secciones clave

Clave Descripción
env_file Carga variables de entorno externas desde quot.envquot para no exponer credenciales en el YAML.
volumes Persistencia de datos: db_data para la base de datos y carpeta local html/ para el código WP.
networks Red interna para que los contenedores se comuniquen sin exponer puertos externos innecesarios.
depends_on Establece orden de arranque: WordPress y phpMyAdmin esperan a que MySQL esté listo.

6. Variables de entorno en .env

Crea un fichero .env en la raíz de tu proyecto con el siguiente contenido:

MYSQL_DATABASE=wordpress
MYSQL_USER=wp_user
MYSQL_PASSWORD=wp_pass
MYSQL_ROOT_PASSWORD=root_pass
    

Este archivo no debe subirse a tu repositorio, añade .env a tu .gitignore para proteger credenciales.

7. Levantar el entorno

  1. Sitúate en la carpeta raíz (wp-docker/).
  2. Ejecuta docker-compose up -d para descargar imágenes y crear contenedores.
  3. Verifica el estado con docker-compose ps o docker ps.
  4. Accede a http://localhost:8080 y sigue el asistente de instalación de WordPress.
  5. Para phpMyAdmin, visita http://localhost:9090 y entra con usuario root y contraseña root_pass.

8. Buenas prácticas y personalización

8.1 Versionado del entorno

  • Mantén tu docker-compose.yml en el control de versiones. Cada cambio en la configuración de servidores web o PHP debe registrarse.
  • Etiquetas de imágenes: en lugar de latest, usar versiones concretas como wordpress:5.8-php8.0-apache para evitar sorpresas.

8.2 Configuración adicional de PHP/Apache

Puedes montar un fichero personalizado de php.ini o apache2.conf:

  • Crear directorio config/php/ y archivo php.ini con directivas deseadas.
  • Modificar volumen de servicio wordpress:
    volumes:

      - ./config/php/php.ini:/usr/local/etc/php/php.ini
            

9. Persistencia y backups

  • Base de datos: Utiliza un volumen dedicado (db_data). Para backups, ejecuta:
    docker exec wp_db /usr/bin/mysqldump -u root -proot_pass wordpress > backups/wp_backup.sql
  • Archivos de WordPress: Los plugins y temas están en html/wp-content/. Copia ese directorio a backups/.
  • Automatiza con scripts o soluciones como wordpress-deploy.

10. Despliegue en producción

Para producción, recomendamos:

  • Separar entornos: staging, production con archivos docker-compose.staging.yml y docker-compose.prod.yml.
  • Usar Swarm o Kubernetes para alta disponibilidad.
  • Configurar certificados SSL con Lets Encrypt.
  • Optimizar rendimiento con caché (Redis, Varnish), CDN y workers en contenedores separados.
  • Monitorizar: Prometheus, Grafana.

11. Seguridad

  • No exponer puertos de la base de datos al exterior usar sólo la red interna.
  • Rotar contraseñas periódicamente y almacenarlas en servicios de secretos (Docker Secrets o HashiCorp Vault).
  • Limitar permisos de archivos en html/: chown -R www-data:www-data html/ y find html/ -type d -exec chmod 755 {} .
  • Aplicar actualizaciones de WordPress y plugins con regularidad.

12. Integración continua y despliegue continuo (CI/CD)

Flujo típico utilizando GitHub Actions o GitLab CI:

  • Build: Verificar sintaxis del docker-compose.yml con docker-compose config.
  • Test: Levantar un entorno temporal y ejecutar tests PHP/Unit o WP-CLI.
  • Push: Subir imágenes propias a un registry privado (Docker Hub, GitHub Container Registry).
  • Deploy: Ejecutar docker pull y docker-compose up -d en servidores remotos.

Conclusión

Docker y Docker Compose ofrecen una forma robusta de gestionar entornos de desarrollo y producción
para WordPress, garantizando reproducibilidad, aislamiento y facilidad de mantenimiento. Con un
docker-compose.yml bien estructurado, un buen manejo de volúmenes, redes y variables de
entorno, es posible crear flujos de trabajo profesionales, seguros y escalables. A partir de aquí,
podrás adaptar configuraciones, añadir herramientas de caché, balanceadores de carga o CI/CD para
ajustar el entorno a tus necesidades.

Recursos y referencias



Acepto donaciones de BAT's mediante el navegador Brave 🙂



Deja una respuesta

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