WordPress en Docker: laboratorio con datos persistentes

Índice de contenido
  1. Prepara el proyecto y los secretos
  2. Define los servicios en compose.yaml
  3. Inicia y comprueba
  4. Qué conserva los datos
  5. Respaldos y paso a un servidor real
  6. Preguntas frecuentes
    1. ¿Puedo reutilizar mis datos si cambio la imagen?
    2. ¿Por qué veo WordPress vacío en otra carpeta?
    3. ¿Guardar secretos en archivos los cifra?
  7. En pocas palabras
  8. Conclusión
  9. Fuentes y documentación

Puedes ejecutar WordPress localmente con Docker Compose y una base MySQL. El objetivo de este ejemplo es practicar sin instalar PHP o MySQL directamente en el host. Mantiene los datos en volúmenes y publica la web únicamente en tu equipo.

Necesitas Docker Engine o Desktop y el plugin Compose. Comprueba arquitectura y disponibilidad de las imágenes elegidas. Las etiquetas del ejemplo fijan familias de software y pueden actualizarse; registra las versiones o digests si necesitas reproducir exactamente el entorno.

Prepara el proyecto y los secretos

Trabaja en una carpeta nueva. Crea contraseñas de laboratorio distintas para administración de MySQL y para el usuario de WordPress:

mkdir -p wordpress-lab/secrets
cd wordpress-lab
umask 077
openssl rand -base64 32 > secrets/db_root.txt
openssl rand -base64 32 > secrets/db_app.txt
printf 'secrets/\n.env\n' > .gitignore

Estos archivos no deben entrar en Git ni compartirse. Los secretos de Compose basados en archivos no ofrecen las mismas garantías que un almacén de secretos de una plataforma administrada; sigue protegiendo el host y sus respaldos.

Define los servicios en compose.yaml

services:
  db:
    image: mysql:8.4
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD_FILE: /run/secrets/db_app
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root
    secrets:
      - db_app
      - db_root
    volumes:
      - db_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1"]
      interval: 10s
      timeout: 5s
      retries: 12
  wordpress:
    image: wordpress:php8.3-apache
    ports:
      - "127.0.0.1:8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_app
    secrets:
      - db_app
    volumes:
      - wp_data:/var/www/html
    depends_on:
      db:
        condition: service_healthy
secrets:
  db_app:
    file: ./secrets/db_app.txt
  db_root:
    file: ./secrets/db_root.txt
volumes:
  db_data:
  wp_data:

La base no publica un puerto en el host. WordPress utiliza el nombre db dentro de la red del proyecto. En un contenedor, localhost se refiere al propio contenedor y no al servicio de base de datos.

Inicia y comprueba

docker compose config --quiet
docker compose up -d
docker compose ps
docker compose logs --tail 50 db wordpress
curl -I http://127.0.0.1:8080

Abre esa dirección en el navegador y completa el asistente. Crea un administrador de WordPress diferente de las cuentas de MySQL. Guarda una entrada de prueba y vuelve a abrirla después de reiniciar el proyecto.

El healthcheck permite esperar a que MySQL responda, pero no demuestra por sí solo que las credenciales de aplicación sean correctas. Si WordPress no conecta, revisa nombre de base, usuario, secreto y logs.

Qué conserva los datos

Los volúmenes db_data y wp_data sobreviven a una recreación normal de los contenedores. El nombre real del volumen incluye el proyecto, por lo que cambiar de carpeta o nombre de proyecto puede hacer que aparezca una instalación distinta.

docker compose stop
docker compose start
docker volume ls

No utilices docker compose down -v como instrucción de limpieza rutinaria: elimina volúmenes del proyecto y puede destruir la instalación. Una contraseña nueva en un archivo tampoco cambia automáticamente la de una base ya inicializada.

Respaldos y paso a un servidor real

Respalda la base con una herramienta compatible y conserva archivos, configuración y secretos de forma protegida. Una copia de un volumen mientras la base escribe no garantiza un backup lógico consistente.

Este entorno HTTP local no está preparado para publicar en internet. Un servidor real requiere TLS, acceso restringido, versiones mantenidas, correo, actualizaciones, recuperación y supervisión. También debes revisar las URLs al migrar, porque localhost no será la dirección pública del sitio.

Preguntas frecuentes

¿Puedo reutilizar mis datos si cambio la imagen?

Depende de la compatibilidad de la aplicación y de MySQL. Respalda, revisa el procedimiento de actualización y prueba en una copia antes de cambiar versiones importantes.

¿Por qué veo WordPress vacío en otra carpeta?

Compose puede crear otro proyecto y otros volúmenes. Identifica los recursos existentes antes de borrar o inicializar, y utiliza un nombre de proyecto consistente.

¿Guardar secretos en archivos los cifra?

No automáticamente. El ejemplo evita contraseñas dentro del Compose y del repositorio, pero los archivos y sus copias siguen necesitando permisos y protección apropiados.

En pocas palabras

Un WordPress de práctica necesita aplicación, base de datos, persistencia y credenciales coherentes. Compose facilita recrear servicios, pero no sustituye respaldos, HTTPS o mantenimiento de producción.

Conclusión

Completa la instalación local, guarda una copia de archivos y base de datos y ensaya su recuperación. Usa este proyecto como laboratorio antes de diseñar un despliegue público.

Para continuar, revisa Cómo instalar WordPress paso a paso: guía rápida y Proteger tu Sitio Web de WordPress con Cisco Duo.

Fuentes y documentación

Documentación de hub.docker.com.

Documentación de docs.docker.com.

Subir

Descubre más de Sergio Caballero

Suscríbete ahora para seguir leyendo y obtener acceso al archivo completo.

Continuar leyendo