Instalar WordPress en Docker: Guía Completa con SSL y Nginx 2025
📋 TL;DR
Aprende a instalar WordPress en Docker con Nginx como reverse proxy y certificados SSL automáticos con Let’s Encrypt. Esta guía completa te lleva desde cero hasta producción con un stack profesional, backups automáticos y alta disponibilidad.
Lo que conseguirás:
- ✅ WordPress funcionando en Docker con aislamiento total
- ✅ SSL automático con renovación cada 90 días
- ✅ Nginx optimizado como reverse proxy con caché
- ✅ Scripts de backup y restauración funcionales
- ✅ Stack listo para producción con healthchecks
Tiempo de lectura: ~25 minutos | Nivel: Intermedio
—📚 Tabla de Contenidos
- Introducción
- ¿Por qué WordPress en Docker?
- Arquitectura del Stack
- Requisitos Previos
- Instalación Paso a Paso
- Configuración de SSL con Let’s Encrypt
- Configuración Avanzada
- Backups Automáticos
- Seguridad y Hardening
- Troubleshooting Común
- Comparativa con Alternativas
- Preguntas Frecuentes
- Conclusión y Próximos Pasos
> 📅 Última actualización: Diciembre 2025
> ✅ Verificado con: WordPress 6.4, Docker 24.0, Nginx 1.25, MySQL-guia-completa-tutorial-2025/) 8.0
> 🔄 Próxima revisión: Marzo 2026
—Introducción {#introduccion}
WordPress sigue siendo el CMS más popular del mundo, con más del 40% de todos los sitios web. Sin embargo, la instalación tradicional (LAMP/LEMP stack) tiene limitaciones: dependencias del sistema, dificultad para actualizar, y complicaciones al escalar.
El problema: Instalar WordPress directamente en el servidor significa que cada actualización puede romper dependencias, los backups son complejos, y mover el sitio a otro servidor requiere reconfigurar todo desde cero.
La solución: Docker containeriza WordPress, MySQL y Nginx en contenedores aislados. Con Docker Compose, defines todo el stack en un archivo YAML y lo levantas con un solo comando. Añade Nginx como reverse proxy para manejar SSL automáticamente y obtienes un stack profesional listo para producción.
En esta guía completa aprenderás:
- Cómo crear un stack WordPress completo con Docker Compose
- Configurar Nginx como reverse proxy con SSL/TLS
- Obtener y renovar certificados SSL automáticamente con Let’s Encrypt
- Implementar backups automáticos y restauraciones
- Hardening de seguridad para producción
- Troubleshooting de problemas comunes
Ya seas sysadmin, desarrollador o entusiasta de homelab, esta guía te dará un WordPress self-hosted profesional y escalable.
—
¿Por qué WordPress en Docker? {#por-que-docker}
Ventajas de Docker vs Instalación Tradicional
Aislamiento total: Cada servicio (WordPress, MySQL, Nginx) corre en su propio contenedor, evitando conflictos de versiones PHP, dependencias del sistema, o problemas de permisos.
Portabilidad: El mismo docker-compose.yml funciona en cualquier servidor con Docker, sin importar si es Ubuntu, Debian, CentOS o incluso Windows Server. Mueve tu WordPress completo copiando una carpeta.
Escalabilidad: Fácil escalar horizontalmente añadiendo más contenedores WordPress detrás de un load balancer. Cada instancia es idéntica y reproducible.
Backups simples: Los volúmenes Docker se pueden respaldar fácilmente. Restaurar es tan simple como copiar carpetas y levantar contenedores.
Actualizaciones seguras: Actualizar WordPress es docker compose pull && docker compose up -d. Si algo falla, vuelves atrás en segundos.
SSL automático: Con Nginx y Certbot, obtienes certificados SSL gratuitos que se renuevan automáticamente cada 90 días.
Cuándo NO usar Docker
- Hosting compartido: Docker requiere acceso root y control del servidor
- Recursos muy limitados: Docker añade overhead mínimo pero existe (RAM, CPU)
- Aprendizaje inicial: Si nunca has usado Docker, hay curva de aprendizaje
Para homelabs, servidores dedicados, o VPS, Docker es la mejor opción.
—Arquitectura del Stack {#arquitectura}
Nuestro stack consta de 4 servicios principales:
Componentes:
- Nginx: Reverse proxy que maneja SSL/TLS, redirige HTTP a HTTPS, y cachea archivos estáticos
- WordPress: Contenedor oficial con PHP-FPM, conecta a MySQL vía red Docker
- MySQL: Base de datos persistente en volumen Docker
- Certbot: Contenedor que renueva certificados SSL automáticamente
Red Docker: Todos los contenedores están en la misma red wordpress_network, permitiendo comunicación interna sin exponer puertos al host.
Volúmenes:
wp_data: Archivos WordPress (themes, plugins, uploads)db_data: Base de datos MySQLcertbot_data: Certificados SSLcertbot_www: Archivos de validación Let’s Encrypt
Requisitos Previos {#requisitos}
Software Necesario
- Docker: Versión 20.10 o superior
- Docker Compose: Versión 2.0 o superior (incluido con Docker Desktop)
- Dominio: Opcional pero recomendado para SSL (puedes usar IP para pruebas)
Verificar Instalación
Puertos Requeridos
- 80: HTTP (redirige a HTTPS)
- 443: HTTPS (WordPress con SSL)
Verifica que estos puertos estén libres:
Si están en uso, detén el servicio o cambia los puertos en docker-compose.yml.
DNS (Opcional pero Recomendado)
Para SSL con Let’s Encrypt, necesitas un dominio apuntando a tu servidor:
—Instalación Paso a Paso {#instalacion}
Paso 1: Crear Estructura de Directorios
Paso 2: Configurar Variables de Entorno
Crea el archivo .env:
⚠️ IMPORTANTE: Cambia los passwords por defecto antes de iniciar. Genera passwords seguros:
Paso 3: Docker Compose Completo
Crea docker-compose.yml:
Paso 4: Configuración Nginx Principal
Crea nginx/nginx.conf:
Paso 5: Configuración WordPress + SSL
Crea nginx/wordpress.conf (reemplaza tudominio.com con tu dominio):
Paso 6: Configuración PHP
Crea uploads.ini:
Paso 7: Iniciar el Stack
Espera 30-60 segundos a que MySQL esté listo. Verifica los logs:
Paso 8: Acceder a WordPress
Abre tu navegador en http://tu-ip o http://tudominio.com y completa la instalación de WordPress.

Configuración de SSL con Let’s Encrypt {#ssl}
Obtener Certificado SSL
Una vez que WordPress está funcionando, obtén el certificado SSL:
Requisitos:
- Dominio apuntando a tu servidor (DNS configurado)
- Puerto 80 accesible desde internet
- WordPress funcionando en HTTP
Renovación Automática
El contenedor certbot renueva automáticamente los certificados cada 12 horas. Si queda menos de 30 días para expirar, se renueva.
Para verificar renovación manual:
Reiniciar Nginx
Después de obtener el certificado, reinicia Nginx:
Ahora accede a https://tudominio.com y deberías ver el candado verde.
Configuración Avanzada {#configuracion-avanzada}
Optimización de Rendimiento
Caché en WordPress:
Instala un plugin de caché como WP Super Cache o W3 Total Cache. Esto reduce la carga del servidor significativamente.
OPcache en PHP:
Añade a uploads.ini:
Límites de Recursos:
Ajusta recursos en docker-compose.yml:
Variables de Entorno Adicionales
Añade a .env:
Múltiples Sitios WordPress
Para múltiples sitios, crea un stack por sitio o usa Nginx Proxy Manager (ver artículo relacionado).
—Backups Automáticos {#backups}
Script de Backup
Crea scripts/backup.sh:
Hazlo ejecutable:
Backup Manual
Backup Automático (Cron)
Añade a crontab:
Añade esta línea (backup diario a las 2 AM):
Restaurar desde Backup
Crea scripts/restore.sh:
Hazlo ejecutable:
Uso:
—
Seguridad y Hardening {#seguridad}
Firewall
Bloquea todos los puertos excepto 80 y 443:
Secrets Management
NUNCA hardcodees passwords en docker-compose.yml. Usa archivo .env y añádelo a .gitignore:
Actualizaciones Automáticas
Usa Watchtower para actualizar contenedores automáticamente:
Hardening WordPress
- Cambiar
WP_DEBUGafalseen producción (ya configurado en.env)
- Instalar plugin de seguridad: Wordfence o Sucuri Security
- Limitar intentos de login: Plugin «Limit Login Attempts Reloaded»
- Deshabilitar editor de archivos: Añade a
wp-config.php:
- Cambiar prefijo de tablas: Ya configurado con
TABLE_PREFIXen.env
- Usar passwords fuertes: Genera con
openssl rand -base64 32
Security Headers
Ya configurados en nginx/wordpress.conf:
Strict-Transport-Security: Fuerza HTTPSX-Frame-Options: Previene clickjackingX-Content-Type-Options: Previene MIME sniffingX-XSS-Protection: Protección XSS básica
Troubleshooting Común {#troubleshooting}
Error: «Error establishing database connection»
Causa: WordPress no puede conectar a MySQL.
Solución:
- Verificar que MySQL está corriendo:
- Verificar variables de entorno:
- Verificar red Docker:
- Probar conexión manual:
Error: «Permission denied» en wp-content
Causa: Permisos incorrectos en volúmenes.
Solución:
SSL no funciona / Certificado no se renueva
Causa: Certbot no puede validar dominio o renovación falla.
Solución:
- Verificar DNS:
- Verificar puerto 80 accesible desde internet
- Verificar logs:
- Renovar manualmente:
WordPress muy lento
Causa: Falta de caché, PHP mal configurado, o recursos insuficientes.
Solución:
- Instalar plugin de caché (WP Super Cache, W3 Total Cache)
- Aumentar memoria PHP en
uploads.ini:
- Aumentar recursos Docker:
- Habilitar OPcache (ver sección Configuración Avanzada)
Error: «Maximum upload file size exceeded»
Causa: Límites de PHP o Nginx muy bajos.
Solución:
- Aumentar en
uploads.ini:
- Aumentar en Nginx (
nginx/wordpress.conf):
- Reiniciar contenedores:

Comparativa con Alternativas {#comparativa}
WordPress en Docker vs Instalación Tradicional
| Criterio | Docker | Tradicional |
|---|---|---|
| Aislamiento | ✅ Total | ❌ Comparte sistema |
| Portabilidad | ✅ Mismo código en cualquier servidor | ❌ Depende del sistema |
| Backups | ✅ Copiar volúmenes | ⚠️ Scripts complejos |
| Actualizaciones | ✅ docker compose pull | ⚠️ Manual, puede romper |
| Escalabilidad | ✅ Horizontal fácil | ❌ Vertical solo |
| Curva aprendizaje | ⚠️ Requiere Docker | ✅ Más familiar |
| Rendimiento | ✅ Similar | ✅ Similar |
Nginx vs Apache
| Criterio | Nginx | Apache |
|---|---|---|
| Rendimiento | ✅ Mejor con alta concurrencia | ⚠️ Más pesado |
| Memoria | ✅ Muy eficiente | ⚠️ Más consumo |
| Configuración | ⚠️ Sintaxis propia | ✅ .htaccess familiar |
| SSL | ✅ Terminación SSL nativa | ✅ Soporte completo |
| Recomendado para | Reverse proxy, alta carga | WordPress tradicional |
MySQL vs MariaDB
| Criterio | MySQL | MariaDB |
|---|---|---|
| Licencia | ⚠️ Oracle (GPL con restricciones) | ✅ Completamente open source |
| Rendimiento | ✅ Excelente | ✅ Excelente (fork de MySQL) |
| Compatibilidad | ✅ Estándar | ✅ 100% compatible con MySQL |
| Recomendado | Producción enterprise | Homelab, proyectos open source |
Preguntas Frecuentes {#faq}
¿Puedo usar otro dominio después de configurar?
Sí, pero necesitas:
- Actualizar
DOMAINen.env - Actualizar
server_nameennginx/wordpress.conf - Obtener nuevo certificado SSL con Certbot
- Actualizar
WP_HOMEyWP_SITEURLen WordPress (Settings → General)
¿Cómo actualizo WordPress?
Los datos en volúmenes se mantienen intactos.
¿Funciona con plugins de WordPress?
Sí, todos los plugins funcionan normalmente. Algunos plugins que requieren acceso al sistema (como algunos de backup) pueden necesitar configuración adicional.
¿Cuánta RAM necesito?
Mínimo recomendado:
- 2GB: Para desarrollo/testing
- 4GB: Para producción con tráfico bajo (<1000 visitas/día)
- 8GB+: Para producción con tráfico medio-alto
¿Puedo usar este stack en producción?
Sí, este stack está listo para producción con:
- Healthchecks en todos los servicios
- Restart policies (
unless-stopped) - SSL automático
- Backups programables
- Security headers configurados
Añade monitoring (Prometheus/Grafana) y logs centralizados para producción enterprise.
¿Cómo cambio el puerto de WordPress?
Edita docker-compose.yml:
¿Puedo usar múltiples sitios WordPress?
Sí, dos opciones:
- Stack separado por sitio: Crea una carpeta por sitio con su propio
docker-compose.yml - Nginx Proxy Manager: Usa Nginx Proxy Manager para gestionar múltiples sitios desde una UI
¿Cómo accedo a la base de datos directamente?
O desde fuera del contenedor (si expones el puerto):
¿Los backups incluyen los certificados SSL?
No, los certificados SSL se renuevan automáticamente. Si quieres respaldarlos:
¿Puedo usar Cloudflare con este stack?
Sí, pero configura Cloudflare en modo «Full (strict)» para mantener SSL end-to-end. El certificado SSL seguirá siendo necesario en el servidor.
¿Cómo migro un WordPress existente a Docker?
- Exporta base de datos del WordPress antiguo
- Copia carpeta
wp-contentcompleta - Restaura base de datos en el nuevo stack
- Copia
wp-contental volumen Docker - Actualiza URLs en base de datos (usar plugin «Better Search Replace»)
¿Qué pasa si el contenedor se cae?
Con restart: unless-stopped, Docker reinicia automáticamente el contenedor. Para monitoreo, usa herramientas como Uptime Kuma o Prometheus.
¿Puedo usar este stack sin dominio (solo IP)?
Sí, pero sin SSL. Comenta las líneas SSL en nginx/wordpress.conf y accede por HTTP. Para SSL necesitas un dominio válido.
¿Cómo veo los logs de WordPress?
¿Puedo usar este stack con Kubernetes?
Sí, pero necesitas convertir docker-compose.yml a manifiestos Kubernetes (Deployments, Services, Ingress). Considera usar Kompose para conversión automática.
Conclusión y Próximos Pasos {#conclusion}
Has configurado un stack WordPress profesional en Docker con Nginx y SSL automático. Tienes:
- ✅ WordPress aislado y portable
- ✅ SSL/TLS con renovación automática
- ✅ Backups programables
- ✅ Stack listo para producción
Próximos Pasos
- Instalar plugins esenciales:
– Caché: WP Super Cache o W3 Total Cache
– Seguridad: Wordfence o Sucuri
– SEO: Yoast SEO o Rank Math
- Configurar monitoring:
– Prometheus + Grafana-loki-stack-de-observabilidad-completo-para-tu-homelab-2025/) para métricas
– Uptime Kuma para disponibilidad
- Optimizar rendimiento:
– CDN (Cloudflare)
– Caché de objetos (Redis)
– Optimización de imágenes
- Aprender más:
– Docker Compose: De 0 a Homelab Completo
– Nginx Proxy Manager: Reverse Proxy con UI
– Portainer: Gestiona Docker con Interfaz Web
📦 Descargar Ejemplos
Todos los archivos de este tutorial están disponibles en GitHub:
Incluye:
docker-compose.ymlcompleto- Configuraciones Nginx
- Scripts de backup/restauración
- Template
.env - README con instrucciones
Artículos Relacionados
- Docker Compose: De 0 a Homelab Completo en 2025
- Nginx Proxy Manager: Reverse Proxy con UI Visual y SSL Automático
- Portainer: Gestiona Docker con Interfaz Web (Guía Completa 2025)
- Traefik Reverse Proxy: Guía Completa para Homelab 2025
- Caddy Reverse Proxy: SSL Automático y Configuración Simple
¿Has instalado WordPress en Docker con éxito? Comparte tu experiencia en los comentarios. Si tienes dudas sobre configuración avanzada o troubleshooting, pregunta y te ayudo.
¡Feliz self-hosting! 🚀
