WordPress listo para desplegar en servidores vacíos (Debian, Ubuntu, etc.) con mínima configuración: un archivo .env y unos pocos comandos.
- Requisitos
- Instalación de Docker
- Despliegue paso a paso
- Configuración (.env)
- Optimización de recursos
- Backup y restauración
- Migración e importación
- SSL (HTTPS)
- Comandos útiles
- Estructura del proyecto
- Solución de problemas
- Docker 20.10 o superior
- Docker Compose 2.0 o superior (plugin
docker composeo binariodocker-compose) - Sistema: Debian, Ubuntu u otra distro Linux; también funciona en macOS y Windows con Docker Desktop
Comprobar instalación:
docker --version
docker compose version
# o, según instalación: docker-compose --versionSi no tienes Docker instalado, sigue la sección Instalación de Docker.
# Actualizar e instalar dependencias
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
# Añadir clave y repositorio oficial de Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# En Debian, sustituir "ubuntu" por "debian" en la URL anterior y usar:
# echo "deb [arch=...] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Instalar Docker Engine y Docker Compose
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# (Opcional) Ejecutar Docker sin sudo
sudo usermod -aG docker $USER
# Cerrar sesión y volver a entrar para que aplique- Fedora / RHEL / CentOS: Install Docker Engine
- macOS / Windows: Docker Desktop
- Script oficial (cualquier Linux):
curl -fsSL https://get.docker.com | sh
Sigue estos pasos en orden para levantar WordPress sin errores.
git clone <url-del-repositorio> wpdocker
cd wpdockerSi no usas Git, copia la carpeta del proyecto en el servidor y entra en ella.
cp .env.example .env
nano .env # o vim, vi, etc.Mínimo obligatorio: define estas variables:
| Variable | Ejemplo | Descripción |
|---|---|---|
DOMAIN |
midominio.com o localhost |
Dominio del sitio |
MYSQL_ROOT_PASSWORD |
Una contraseña segura | Contraseña root de MySQL |
MYSQL_PASSWORD |
Otra contraseña segura | Contraseña del usuario de WordPress en la BD |
El resto (puertos, base de datos, recursos) tiene valores por defecto; puedes dejarlos o ajustarlos más adelante.
Este script genera la configuración de Nginx y PHP a partir del .env. Debe ejecutarse antes del primer docker compose up.
./scripts/setup.shSi aparece algún error (por ejemplo falta DOMAIN o contraseñas), corrige el .env y vuelve a ejecutar ./scripts/setup.sh.
./scripts/test-complete.shSi todo es correcto, el script termina sin errores y puedes seguir.
Para que los contenedores usen la RAM definida en .env (y no se queden en ~900M ni den 502), arranca con:
./scripts/up.shO bien: docker compose --compatibility up -d. Si usas solo docker compose up -d, Docker no aplica los límites de memoria y el sitio puede ir lento o dar 502.
Espera a que MySQL marque healthy y WordPress y Nginx estén Up. Puedes seguir los logs:
docker compose logs -fPulsa Ctrl+C para salir de los logs (los contenedores siguen en marcha).
- Abre
http://<DOMAIN>(ohttp://localhostsiDOMAIN=localhost). - Si usas otro puerto (p. ej.
HTTP_PORT=8080en.env), usahttp://localhost:8080. - Sigue el asistente de instalación (idioma, usuario administrador, etc.).
Cuando termines, ya tienes WordPress funcionando con Docker.
cd wpdocker
cp .env.example .env
nano .env # Definir DOMAIN, MYSQL_ROOT_PASSWORD, MYSQL_PASSWORD
./scripts/setup.sh
./scripts/test-complete.sh # opcional
docker compose up -d
# Abrir en navegador: http://<DOMAIN> o http://localhostCopia .env.example a .env y ajusta lo que necesites. Variables principales:
| Variable | Obligatorio | Descripción |
|---|---|---|
DOMAIN |
Sí | Dominio del sitio (ej. midominio.com o localhost) |
MYSQL_ROOT_PASSWORD |
Sí | Contraseña del usuario root de MySQL |
MYSQL_PASSWORD |
Sí | Contraseña del usuario de WordPress en la BD |
COMPOSE_PROJECT_NAME |
No | Identificador del proyecto (default: wpdocker) |
MYSQL_DATABASE, MYSQL_USER |
No | Base de datos y usuario (default: wordpress_db, wordpress_user) |
HTTP_PORT, HTTPS_PORT |
No | Puertos en el host (default: 80, 443) |
WORDPRESS_DEBUG |
No | true o false (default: false) |
Más opciones (recursos, MySQL, PHP, Nginx) están documentadas en .env.example. No subas .env a Git (ya está en .gitignore).
Si cambias DOMAIN o HTTP_PORT/HTTPS_PORT, vuelve a ejecutar ./scripts/setup.sh y reinicia:
./scripts/setup.sh
docker compose up -dEl proyecto está pensado para servidores con pocos recursos (p. ej. 2 cores, 1 GB RAM). Los límites por defecto ya están ajustados para reducir 503 y cuelgues.
Al ejecutar ./scripts/setup.sh, si no tienes variables DOCKER_* en .env, se muestran valores recomendados según el sistema. Puedes copiarlos al .env o usar los valores por defecto.
./scripts/detect-resources.shCopia las variables que imprima (DOCKER_, MYSQL_, PHP_, NGINX_) a tu .env y vuelve a ejecutar ./scripts/setup.sh y docker compose up -d.
| Variable | Descripción | Default (servidor pequeño) |
|---|---|---|
DOCKER_MYSQL_MEMORY_LIMIT |
RAM máxima MySQL | 360M |
DOCKER_WP_MEMORY_LIMIT |
RAM máxima WordPress | 300M |
DOCKER_NGINX_MEMORY_LIMIT |
RAM máxima Nginx | 80M |
MYSQL_INNODB_BUFFER_POOL_SIZE |
Buffer InnoDB | 160M |
PHP_MEMORY_LIMIT |
Memoria PHP | 160M |
NGINX_WORKER_PROCESSES |
Workers Nginx | 2 |
Si ves 503 o el servidor muy lento, ejecuta ./scripts/detect-resources.sh, ajusta según las recomendaciones y reinicia los contenedores.
Servidor con 1 GB RAM: Si tienes solo 1 GB de RAM, no asignes a los contenedores más de ~740 MB en total o el sistema se colgará o reiniciará. Usa el perfil preparado para 1 GB: docs/servidor-1gb-ram.md y docs/env-1gb-ram.example.
nginx/templates/(en el repo): plantillas con variables como${DOMAIN},${NGINX_WORKER_PROCESSES}.nginx/generated/(no en Git): archivos generados por./scripts/setup.sh.
No edites los archivos en nginx/generated/. Para cambios permanentes, modifica los templates en nginx/templates/ y vuelve a ejecutar ./scripts/setup.sh.
# Con nombre automático (fecha/hora)
./scripts/backup.sh
# Con nombre propio
./scripts/backup.sh mi_backup_enero_2024Se crean:
- Base de datos:
backups/db/<nombre>.sql.gz - Archivos WordPress:
backups/wp/<nombre>.tar.gz - Metadatos:
backups/<nombre>.info
# Ver backups disponibles
ls backups/*.info
# Restaurar uno
./scripts/restore.sh backup_20240101_120000
# o
./scripts/restore.sh mi_backup_enero_2024- En el servidor actual:
./scripts/backup.sh migracion_20240101 - Copiar la carpeta del proyecto (y
backups/) al nuevo servidor. - En el nuevo servidor: crear/editar
.env, ejecutar./scripts/setup.sh,docker compose up -d. - Cuando todo esté arriba:
./scripts/restore.sh migracion_20240101
Si tienes un .sql (o .sql.gz) y un .tar.gz con wp-content de otro servidor:
docker compose up -d
./scripts/import-external.sh /ruta/al/archivo.sql /ruta/al/wp-content.tar.gzSi la URL del sitio ha cambiado, actualiza las URLs en la base de datos (por ejemplo con WP-CLI o un plugin de búsqueda/reemplazo).
Guía detallada: docs/importar-backup-externo.md.
- Instalar Certbot (ej. en Ubuntu/Debian:
sudo apt-get install certbot). - Obtener certificados:
sudo certbot certonly --standalone -d tudominio.com -d www.tudominio.com - Copiar certificados al proyecto:
fullchain.pemyprivkey.pemennginx/certs/. - Configurar el bloque HTTPS en la configuración de Nginx (plantilla o generada) y reiniciar:
docker compose restart nginx
Coloca fullchain.pem y privkey.pem en nginx/certs/ y configura el bloque server HTTPS en la configuración de Nginx (según tus templates o wordpress.conf).
docker compose up -d # Arrancar
docker compose stop # Parar
docker compose down # Parar y eliminar contenedores
docker compose down -v # Además eliminar volúmenes (¡borra datos!)
docker compose logs -f # Logs de todos los servicios
docker compose logs -f wordpress
docker compose restart nginx # Reiniciar un servicio
docker compose ps # Estadodocker compose exec wordpress bash
docker compose exec db bash
docker compose exec db mysql -u wordpress_user -p wordpress_dbdocker compose down -v
docker image prunewpdocker/
├── .env.example # Plantilla → copiar a .env
├── .env # Tu configuración (no versionado)
├── docker-compose.yml # Servicios: db, wordpress, nginx
├── uploads.ini # Límites PHP (subidas, memoria)
├── backups/ # No versionado
│ ├── db/ # .sql.gz
│ └── wp/ # .tar.gz
├── nginx/
│ ├── templates/ # Plantillas (versionadas)
│ ├── generated/ # Generados por setup.sh (no versionado)
│ ├── conf.d/ # 00-default.conf + wordpress.conf
│ └── certs/ # SSL
├── php-config/
│ ├── opcache.ini
│ └── generated/ # memory.ini (generado)
├── scripts/
│ ├── setup.sh # Obligatorio antes del primer up
│ ├── test-complete.sh # Validación opcional
│ ├── detect-resources.sh # Recomendaciones de recursos
│ ├── backup.sh
│ ├── restore.sh
│ └── import-external.sh # Importar .sql + wp-content externos
└── themes/
└── astra-child/
- Comprueba que los contenedores estén en marcha:
docker compose ps - Revisa que
MYSQL_PASSWORDyMYSQL_ROOT_PASSWORDen.envcoincidan con lo que usa el proyecto - Revisa logs:
docker compose logs dbydocker compose logs wordpress
- Revisa logs:
docker compose logs nginx - Asegúrate de haber ejecutado
./scripts/setup.shantes dedocker compose up -d - Valida la configuración:
docker compose exec nginx nginx -t
En .env define otros puertos, por ejemplo:
HTTP_PORT=8080
HTTPS_PORT=8443Luego: ./scripts/setup.sh y docker compose up -d.
- Comprueba que existan
backups/db/<nombre>.sql.gzybackups/wp/<nombre>.tar.gz - El nombre que pasas a
./scripts/restore.shdebe coincidir con el del backup (sin extensión)
docker compose exec wordpress chown -R www-data:www-data /var/www/html
docker compose exec wordpress chmod -R 755 /var/www/html- No subas
.enva Git. - Cambia las contraseñas por defecto en producción.
- Usa HTTPS en producción.
- Mantén WordPress y plugins actualizados.
- Haz backups antes de actualizaciones importantes.
Configuración personalizada para WordPress con Docker.
¿Problemas? Revisa la sección Solución de problemas o la documentación de Docker y WordPress.