Cómo instalar WordPress en Docker - Stack completo con MariaDB y phpMyAdmin autohospedado

WordPress | CMS | Docker

WordPress en Docker: Stack completo autohospedado con MariaDB, phpMyAdmin y Nginx (alternativa Wordpress.com, Wix)

WordPress CMS ligero en contenedor. MariaDB base de datos optimizada. phpMyAdmin para gestión BD visual. Nginx reverse proxy. Volúmenes persistentes. Backups fáciles. HTTPS con Caddy. SSL automático. Escalable. Prodction-ready. AGPL/GPL open source.

¿Qué es WordPress en Docker?


WordPress en Docker es una instalación completa del CMS más popular del mundo (40% de internet) empaquetada en contenedores con MariaDB y phpMyAdmin, permitiendo tener un sitio web totalmente funcional y autohospedado sin dependencia de hosting SaaS como WordPress.com o Wix. Es la solución ideal para blogs, sitios corporativos, tiendas online con total control y propiedad de datos.

Propuesta clave: WordPress CMS contenorizado (último core). MariaDB (fork MySQL optimizado, MySQL-compatible). phpMyAdmin para gestión BD visual (backup/restore). Nginx reverse proxy (rápido, eficiente). Volúmenes Docker persistentes (datos seguros). Backups triviales (cp de volumes). HTTPS automático (Let's Encrypt via Caddy). SSL certificados gratis. Multi-sitio WordPress supportado. Plugins + themes unlimited. Escalable horizontalmente (balancing). Zero vendor lock-in. Datos tuyos siempre. GPL/AGPL open source.

Características principales: WordPress core última versión. MariaDB 10.6+ (optimizado, MySQL-compatible). phpMyAdmin interfaz web BD. Nginx (alta performance). PHP 8.2+ (moderno). Docker Compose setup (fácil deploy). Volúmenes persistentes (wp-data, db-data). Networking automático (service discovery). Health checks. Auto-restart. Backups volumenes fáciles. SSL/HTTPS automático. Reverse proxy Caddy. Multi-sitio WordPress. 60K+ plugins. 10K+ temas. Usuarios/roles RBAC. Media library optimizado. SEO friendly. Cache plugins soportados (Redis, Memcached via compose). Debugging tools (WP-CLI). Database optimization tools. Performance monitoring. Seguridad hardened (WP hardening plugins). Multiidioma. WPML soporte. Staging/development environments fácil. Production-ready. Tested Docker official images.

Para sitios web: CMS profesional self-hosted. Total control. Datos tuyos. Costo bajo. Escalable. Setup simple.

Características principales

WordPress core última versión

CMS más popular. 40% internet. Potente, flexible, robusto.

MariaDB optimizada

Base datos ligera. MySQL-compatible. Rápida, eficiente.

phpMyAdmin web UI

Gestión BD visual. Backup/restore. Sin CLI necesario.

Nginx high-performance

Web server rápido. Bajo recursos. Reverse proxy integrado.

Volúmenes persistentes

Datos seguros. Docker volumes. Backups triviales.

HTTPS automático

SSL certificados gratis. Let's Encrypt. Caddy integration.

60K+ plugins + 10K+ temas

Ecosistema masivo. Extensibilidad total. Personalizacion infinita.

Multi-sitio WordPress

Múltiples blogs en una instalación. Gestión centralizada.

Users + Roles RBAC

Control acceso granular. Admin, editor, author, contributor.

Media library optimizado

Imágenes, videos, archivos. Redimensionamiento automático.

SEO-friendly

Yoast SEO plugin. Sitemaps. Canonicals. Structured data.

Production-ready

Tested, escalable, seguro. Usado millones sitios.

Requisitos del sistema

  • Docker & Docker Compose (versión 20+ recomendada)
  • 1 GB - 4 GB RAM mínimo (depende tráfico sitio)
  • 5 GB - 50 GB espacio disco (para DB + uploads + contenido)
  • Puerto 80 y 443 (HTTP y HTTPS, configurables)
  • Volúmenes persistentes para WordPress, MariaDB, phpMyAdmin
  • Dominio apuntando a servidor (para HTTPS automático)
  • Email servidor SMTP (opcional, para notificaciones)
  • Navegador moderno (editar posts, gestión admin)
Setup recomendado: 2 GB RAM mínimo para tráfico pequeño. 4+ GB para tráfico medio. SSD recomendado.

Instalación con Docker Compose

Opción 1: Docker Compose completo (recomendado)

cat > docker-compose.yml << 'EOF' version: '3.8' services: # MariaDB - Base de datos mariadb: image: mariadb:latest container_name: wordpress_db restart: unless-stopped environment: - MYSQL_DATABASE=wordpress - MYSQL_ROOT_PASSWORD=tu_contraseña_root_fuerte - MYSQL_USER=wordpress - MYSQL_PASSWORD=tu_contraseña_wordpress_fuerte - TZ=Europe/Madrid volumes: - db_data:/var/lib/mysql command: --default-authentication-plugin=mysql_native_password # WordPress - CMS wordpress: image: wordpress:php8.2-fpm container_name: wordpress_app restart: unless-stopped depends_on: - mariadb environment: - WORDPRESS_DB_HOST=mariadb:3306 - WORDPRESS_DB_USER=wordpress - WORDPRESS_DB_PASSWORD=tu_contraseña_wordpress_fuerte - WORDPRESS_DB_NAME=wordpress - WORDPRESS_TABLE_PREFIX=wp_ - WORDPRESS_DEBUG=false volumes: - wordpress_data:/var/www/html # Nginx - Reverse Proxy / Web Server nginx: image: nginx:alpine container_name: wordpress_nginx restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - wordpress_data:/var/www/html:ro depends_on: - wordpress # phpMyAdmin - Gestión BD web UI phpmyadmin: image: phpmyadmin:latest container_name: wordpress_phpmyadmin restart: unless-stopped environment: - PMA_HOST=mariadb - PMA_USER=root - PMA_PASSWORD=tu_contraseña_root_fuerte ports: - "8080:80" volumes: wordpress_data: db_data: EOF docker compose up -d

Crear nginx.conf (si no existe)

cat > nginx.conf << 'EOF' user nginx; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; client_max_body_size 100M; upstream wordpress { server wordpress:9000; } server { listen 80; server_name _; root /var/www/html; index index.php index.html; location ~ \.php$ { fastcgi_pass wordpress; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include /etc/nginx/fastcgi_params; } location ~ /\.ht { deny all; } } } EOF

Acceder (setup WordPress)

http://localhost - Instalador WordPress (5-minute install)

http://localhost:8080 - phpMyAdmin (user: root, password: tu_contraseña_root_fuerte)

Primer setup WordPress (5 minutos)

  1. Abre http://localhost
  2. Selecciona idioma (español disponible)
  3. Información sitio: título, usuario admin, contraseña, email
  4. Instala WordPress
  5. Login con credenciales creadas
  6. ¡Listo! Dashboard WordPress aparece

Primeros pasos

1. Login admin WordPress

  1. Abre http://localhost/wp-admin
  2. Ingresa usuario y contraseña admin
  3. Dashboard principal aparece

2. Crear primer post

  1. Dashboard → Posts → Add New
  2. Título, contenido, categorías, etiquetas
  3. Publish (publicar)
  4. Post aparece en blog frontend

3. Personalizar sitio (apariencia)

  1. Dashboard → Appearance → Themes
  2. Browse free themes o sube custom theme (ZIP)
  3. Activate tema seleccionado
  4. Customize colores, header image, etc

4. Agregar plugins (extensiones)

  1. Dashboard → Plugins → Add New
  2. Busca plugin (e.g., "Yoast SEO")
  3. Install → Activate
  4. Plugin aparece en sidebar izquierdo para configuración

5. Gestionar usuarios y roles

  1. Dashboard → Users → Add New
  2. Email, usuario, contraseña, rol (Administrator, Editor, Author, Contributor, Subscriber)
  3. Cada rol tiene permisos específicos

6. Configurar páginas estáticas (About, Contact, etc)

  1. Dashboard → Pages → Add New
  2. Crea páginas necesarias (About, Contact, Terms)
  3. Appearance → Menus → crear menú con esas páginas

7. Configurar inicio de sesión del sitio

  1. Dashboard → Settings → General
  2. Site Title, Tagline, Site URL
  3. Timezone, date format, week starts

8. Backup de BD con phpMyAdmin

  1. Abre http://localhost:8080
  2. Database: wordpress → Export
  3. Descarga SQL file (backup BD completa)
  4. Guarda en lugar seguro

9. Backup de archivos WordPress (volumes)

docker cp wordpress_app:/var/www/html ./wordpress-backup-$(date +%Y%m%d)

10. Instalar Yoast SEO (plugin popular)

  1. Dashboard → Plugins → Add New
  2. Busca "Yoast SEO"
  3. Install → Activate
  4. Aparece "SEO" en sidebar izquierdo
  5. Configura meta descriptions, keywords en cada post

11. Habilitar permanentes (Pretty URLs)

  1. Dashboard → Settings → Permalinks
  2. Elige "Post name" (para URLs limpias)
  3. Guarda (WordPress auto-actualiza .htaccess)

12. Configurar comentarios y discusiones

  1. Dashboard → Settings → Discussion
  2. Habilita/deshabilita comentarios
  3. Moderación, spam filters (Akismet plugin)

Casos de uso

  • Blogs personales: Full control. Sin publicidad de WordPress.com. Datos tuyos.
  • Sitios corporativos: Presencia web profesional. Portfolio. Contacto.
  • Tiendas online: WooCommerce plugin integrado. Ventas completas. Inventory management.
  • Agencias digitales: Sitios clientes self-hosted. Mantenimiento fácil.
  • Portfolios creativos: Fotógrafos, artistas, diseñadores. Galería de trabajos.
  • Alternativa WordPress.com/Wix: Total control, bajo costo, open source, no vendor lock-in.

HTTPS con Caddy (producción)

Caddyfile para WordPress

midominio.com www.midominio.com { reverse_proxy localhost:80 }

Acceso remoto seguro

https://midominio.com con HTTPS automático y certificado Let's Encrypt

IMPORTANTE: Configurar WordPress URL

# Editar wp-config.php en WordPress container docker exec wordpress_app bash nano /var/www/html/wp-config.php # Agregar o modificar estas líneas: define('WP_HOME', 'https://midominio.com'); define('WP_SITEURL', 'https://midominio.com'); define('FORCE_SSL_ADMIN', true);

Gestión y mantenimiento

Ver logs WordPress

docker logs -f wordpress_app docker logs -f wordpress_db docker logs -f wordpress_nginx

Backup completo (BD + archivos)

mkdir -p ./backups # Backup base datos docker exec wordpress_db mysqldump -u wordpress -p tu_contraseña_wordpress wordpress > ./backups/wordpress-db-$(date +%Y%m%d).sql # Backup archivos WordPress docker cp wordpress_app:/var/www/html ./backups/wordpress-files-$(date +%Y%m%d)

Restore de backup

docker exec -i wordpress_db mysql -u wordpress -p tu_contraseña wordpress < ./backups/wordpress-db-YYYYMMDD.sql # Archivos: reemplaza /var/www/html en volume o copia archivos

Reiniciar servicios

docker compose restart # O servicio específico docker compose restart wordpress

Actualizar WordPress, plugins, temas

# Dashboard WordPress → Updates # Click Update WordPress/plugins/temas automáticamente # O vía WP-CLI en container: docker exec wordpress_app wp core update --allow-root docker exec wordpress_app wp plugin update --all --allow-root

Limpiar caché y optimizar BD

docker exec wordpress_db optimize-tables --all-dbs # O instalar plugin "WP-Optimize" para limpiar automático

Monitorear consumo

docker stats wordpress_app wordpress_db wordpress_nginx

Aumentar límite upload archivos

# Editar wp-config.php define('WP_MEMORY_LIMIT', '256M'); define('WP_MAX_MEMORY_LIMIT', '512M');

Comparativa con alternativas

vs WordPress.com (SaaS)

Docker gana: Costo bajo, control total, plugins unlimited, datos tuyos. SaaS gana: Hosting gestionado, soporte, backup automático.

vs Wix

Docker gana: Flexibilidad total, plugins, temas, cost lower scale. Wix gana: Drag-drop builder, hosting, soporte.

vs Joomla/Drupal Docker

WordPress gana: Más plugins, más simple, mayor comunidad. Joomla/Drupal ganan: Más poderosos para casos complejos.

vs Statically generated sites (Hugo, Jekyll)

WordPress gana: Admin UI, plugins, dynamic, fácil para no-devs. Static ganan: Performance ultra-fast, security simple, cheaper hosting.

Mejor para: Blogueros, pequeñas empresas, agencias. Sitios dinámicos. Control total. Ecosystem masivo. Community support.

Comentarios

Entradas populares de este blog

Cómo Instalar y configurar SERVIDOR VPN WIREGUARD en MIKROTIK 🔐 #VPN #Wireguard #Mikrotik #RouterOS

Cómo instalar y configurar DSM SYNOLOGY 7.2.2 en PC | Guía completa, instalación, RAID 1, SMB

Cómo INSTALAR y CONFIGURAR OpenVPN en MIKROTIK. Guía completa paso a paso.