12 Finalizar el archivo de docker compose
Configuración de Nginx y MySQL (MariaDB)
Este tutorial configura los servicios de Nginx (servidor web) y MySQL (MariaDB) (base de datos) para el proyecto Laravel, añadiéndolos al archivo docker-compose.yml.
📁 Pasos principales
1. Detener los contenedores actuales
Se verifica que hay contenedores en ejecución:
docker psSe detienen todos los contenedores:
docker-compose down
2. Creación de directorios para Nginx
Se crea una estructura de carpetas para la configuración de Nginx:
mkdir -p docker-compose/nginx
3. Configuración de Nginx (boilerplate)
Se crea el archivo de configuración:
nano docker-compose/nginx/default.confSe copia un boilerplate desde la documentación oficial de Laravel
Puntos críticos a revisar:
root /var/www/public→ directorio raíz del proyectolisten 80→ puerto donde escucha Nginxfastcgi_pass app:9000→ conexión con PHP-FPM (puerto 9000)
4. Edición del archivo docker-compose.yml
Se añaden dos nuevos servicios:
🔹 Servicio Nginx
Imagen:
nginx:alpine(liviana y rápida)Política de reinicio:
unless-stoppedPuertos expuestos:
8000:80→ el host usa el puerto 8000, el contenedor el 80
Volúmenes:
./:/var/www→ código del proyecto./docker-compose/nginx/:/etc/nginx/conf.d/→ configuración de Nginx
Red:
laravel(bridge)
🔹 Servicio MySQL (MariaDB)
Imagen:
mariadb:8(MySQL)Política de reinicio:
unless-stoppedVariables de entorno (definidas en el archivo
.envde Laravel):MARIADB_DATABASE: nombre de la BDMARIADB_USER: usuarioMARIADB_PASSWORD: contraseñaMARIADB_ROOT_PASSWORD: contraseña de root
Red:
laravel(bridge)
5. Configuración del archivo .env de Laravel
Se edita el archivo
.envpara que coincida con las variables de entorno:DB_CONNECTION=mysql DB_HOST=db # ⚠️ Importante: usa "db" (nombre del servicio en docker-compose) DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=laravel DB_PASSWORD=secret⚠️ Importante: El
DB_HOSTdebe serdb(el nombre del servicio), nolocalhostni127.0.0.1.
6. Conexión entre contenedores
Todos los contenedores (
app,nginx,db) se conectan a la misma red bridge (laravel)Esto permite que se comuniquen entre sí usando el nombre del servicio (ej.
app:9000,db:3306)
✅ Puntos más importantes destacados
Se detienen los contenedores con
docker-compose downantes de hacer cambios.Se crea un directorio
docker-compose/nginxpara almacenar la configuración de Nginx.Se copia un boilerplate de configuración de Nginx desde la documentación oficial de Laravel.
Se revisan cuidadosamente:
root /var/www/publiclisten 80fastcgi_pass app:9000
Se añaden los servicios Nginx y MySQL al
docker-compose.yml.Se usa
nginx:alpinecomo imagen ligera para el servidor web.Se exponen puertos (
8000:80) para acceder a la aplicación desde el host.Se definen volúmenes para compartir código y configuración.
Se configuran variables de entorno en el archivo
.envde Laravel.El host de la base de datos debe ser
db(nombre del servicio), no localhost.Si todo está correcto, se crearán 3 contenedores (
app,nginx,db) que se comunicarán entre sí gracias a la red bridge.
🔜 Próximo paso (según el tutorial)
Probar que toda la configuración funciona correctamente y corregir errores si los hay.
Si necesitas el resumen en otro formato o más detallado, avísame.
******************
Editar el archivo docker-compose.yml (Añadir Nginx)
Ahora vamos a modificar el archivo docker-compose.yml para añadir el servicio de Nginx.
nano docker-compose.ymlAtención a la indentación: Debe tener 2 espacios por nivel (como indica el video, y es una buena práctica en YAML).
Agrega el siguiente bloque justo debajo de tu servicio app (PHP):
nginx:
image: nginx:stable-alpine # Versión estable y ligera
restart: unless-stopped
ports:
- "8000:80" # Mapeamos el puerto 8000 de tu PC al 80 del contenedor
volumes:
- .:/var/www # Montamos todo el proyecto en /var/www
- ./docker-compose/nginx:/etc/nginx/conf.d # Montamos la configuración
networks:
- laravel
depends_on:
- app # Espera a que PHP esté listo (opcional pero recomendado)Paso 5: Editar docker-compose.yml (Añadir MySQL)
Seguimos en el mismo archivo. Ahora añadimos el servicio de base de datos. En el video usan mysql:8. Vamos a ser más específicos.
Agrega esto debajo del servicio de Nginx:
db:
image: mysql:8.0 # 8.0 es LTS (soporte a largo plazo), más estable que "mysql:8" o "mysql:latest"
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE} # Toma el valor del .env local
MYSQL_USER: ${DB_USERNAME} # Toma el valor del .env local
MYSQL_PASSWORD: ${DB_PASSWORD} # Toma el valor del .env local
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} # (O puedes poner una fija como 'rootsecret')
ports:
- "3306:3306" # Expone MySQL en el puerto 3306 de tu PC (opcional, útil para gestión externa)
volumes:
- db_data:/var/lib/mysql # Persistencia de datos (para no perder la BD al apagar)
networks:
- laravel⚠️ ACTUALIZACIÓN IMPORTANTE (Variables de entorno):
En el video, el instructor copia y pega los valores manualmente (ej.MYSQL_DATABASE: LaravelDB). Esto está mal y es poco profesional.
Práctica actual: Docker Compose lee automáticamente el archivo.envque está en la misma carpeta. Por eso podemos usar${DB_DATABASE}. Así, si cambias el.env, la base de datos se actualiza sola sin tocar el YAML.
Paso 6: Definir la red y el volumen
Al final del archivo docker-compose.yml, debes definir la red que usan todos los servicios para comunicarse, y el volumen para la base de datos.
Agrega esto al final del archivo (sin indentación):
networks:
laravel:
driver: bridge
volumes:
db_data:🔍 Dato clave: Como todos los servicios (
app,nginx,db) están en la misma red (laravel), pueden comunicarse usando el nombre del servicio como si fuera una dirección IP. Por eso en Nginx pusimosfastcgi_pass app:9000y en el.envpondremosDB_HOST=db.
Paso 7: Modificar el archivo .env de Laravel
Este es el paso más crucial y que la gente suele olvidar. Abre tu archivo .env:
nano .envAsegúrate de que las variables de base de datos apunten al contenedor db (y no a localhost o 127.0.0.1):
DB_CONNECTION=mysql
DB_HOST=db # ¡El nombre del servicio en docker-compose.yml!
DB_PORT=3306
DB_DATABASE=laravel_db # (O el nombre que quieras)
DB_USERNAME=laravel_user
DB_PASSWORD=secret❗ ERROR COMÚN DEL VIDEO: En el video, el instructor modifica el
.envpara ponerDB_HOST=db, pero en el transcript se ve confuso porque no lo explica claramente. Sin esto, Laravel no encontrará la base de datos.
Paso 8: Levantar todo el entorno
Con todos los cambios guardados, levanta los contenedores:
docker compose up -dEste comando construirá y levantará los 3 contenedores:
app(PHP-FPM)nginx(Servidor web)db(MySQL)
Verifica que estén corriendo:
docker psDeberías ver tres contenedores con estados Up.
🚀 Resumen y Mejores Prácticas (Actualizado 2025-2026)
| Aspecto | Lo que dice el video (Obsoleto/Mejorable) | Mi recomendación actual |
|---|---|---|
| Comando Docker | docker-compose (con guión) | docker compose (sin guión, es el estándar) |
| Versión de Nginx | nginx:alpine | nginx:stable-alpine (más seguro, versiones estables) |
| Versión de MySQL | mysql:8 | mysql:8.0 (LTS) o mysql:9.0 si quieres lo último. Pero 8.0 es más probado. |
| Variables de entorno | Escritas a mano en el YAML | Usar ${VAR} referenciando el .env automáticamente. |
| Persistencia de BD | No se menciona | Añadir un volumen (volumes: db_data:/var/lib/mysql) para no perder datos al reiniciar. |
| Definición de red | Solo se menciona al vuelo | Definir la red en el footer (networks:) para mejor control. |
| Indentación | 2 espacios (bien) | 2 espacios (sigue siendo el estándar para YAML). |
⚠️ Posibles errores y soluciones
Error de conexión a BD (
SQLSTATE[HY000] [2002]):Causa:
DB_HOSTen.envsigue siendolocalhosto127.0.0.1.Solución: Cámbialo a
db(el nombre del servicio).
Nginx no encuentra los archivos (Error 404 o 500):
Causa: La ruta
rootenapp.confno coincide con el volumen montado.Solución: Asegúrate de que el volumen de
nginxtenga.:/var/wwwy queroot /var/www/public.
El puerto 8000 ya está ocupado:
Solución: Cambia el mapeo de puertos en
docker-compose.ymla"8001:80"(o cualquier otro libre).
Conclusión
Ahora tienes un entorno completo de desarrollo con Laravel + PHP-FPM + Nginx + MySQL orquestado con Docker Compose.
Entras a tu aplicación desde:
http://localhost:8000Los cambios que hagas en tu código local se reflejan al instante gracias a los volúmenes.
La base de datos persiste aunque apagues los contenedores (gracias al volumen
db_data).
¡Listo para empezar a programar! Si quieres, en el siguiente paso podríamos configurar phpMyAdmin o Adminer para gestionar la BD visualmente
Comentarios
Publicar un comentario