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:

    bash
    docker ps
  • Se detienen todos los contenedores:

    bash
    docker-compose down

2. Creación de directorios para Nginx

  • Se crea una estructura de carpetas para la configuración de Nginx:

    bash
    mkdir -p docker-compose/nginx

3. Configuración de Nginx (boilerplate)

  • Se crea el archivo de configuración:

    bash
    nano docker-compose/nginx/default.conf
  • Se copia un boilerplate desde la documentación oficial de Laravel

  • Puntos críticos a revisar:

    • root /var/www/public → directorio raíz del proyecto

    • listen 80 → puerto donde escucha Nginx

    • fastcgi_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-stopped

  • Puertos 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-stopped

  • Variables de entorno (definidas en el archivo .env de Laravel):

    • MARIADB_DATABASE: nombre de la BD

    • MARIADB_USER: usuario

    • MARIADB_PASSWORD: contraseña

    • MARIADB_ROOT_PASSWORD: contraseña de root

  • Red: laravel (bridge)

5. Configuración del archivo .env de Laravel

  • Se edita el archivo .env para que coincida con las variables de entorno:

    env
    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_HOST debe ser db (el nombre del servicio), no localhost ni 127.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 down antes de hacer cambios.

  • Se crea un directorio docker-compose/nginx para 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/public

    • listen 80

    • fastcgi_pass app:9000

  • Se añaden los servicios Nginx y MySQL al docker-compose.yml.

  • Se usa nginx:alpine como 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 .env de 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.

bash
nano docker-compose.yml

Atenció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):

yaml
  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:

yaml
  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 .env que 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):

yaml
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 pusimos fastcgi_pass app:9000 y en el .env pondremos DB_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:

bash
nano .env

Asegúrate de que las variables de base de datos apunten al contenedor db (y no a localhost o 127.0.0.1):

env
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 .env para poner DB_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:

bash
docker compose up -d

Este comando construirá y levantará los 3 contenedores:

  1. app (PHP-FPM)

  2. nginx (Servidor web)

  3. db (MySQL)

Verifica que estén corriendo:

bash
docker ps

Deberías ver tres contenedores con estados Up.


🚀 Resumen y Mejores Prácticas (Actualizado 2025-2026)

AspectoLo que dice el video (Obsoleto/Mejorable)Mi recomendación actual
Comando Dockerdocker-compose (con guión)docker compose (sin guión, es el estándar)
Versión de Nginxnginx:alpinenginx:stable-alpine (más seguro, versiones estables)
Versión de MySQLmysql:8mysql:8.0 (LTS) o mysql:9.0 si quieres lo último. Pero 8.0 es más probado.
Variables de entornoEscritas a mano en el YAMLUsar ${VAR} referenciando el .env automáticamente.
Persistencia de BDNo se mencionaAñadir un volumen (volumes: db_data:/var/lib/mysql) para no perder datos al reiniciar.
Definición de redSolo se menciona al vueloDefinir la red en el footer (networks:) para mejor control.
Indentación2 espacios (bien)2 espacios (sigue siendo el estándar para YAML).

⚠️ Posibles errores y soluciones

  1. Error de conexión a BD (SQLSTATE[HY000] [2002]):

    • Causa: DB_HOST en .env sigue siendo localhost o 127.0.0.1.

    • Solución: Cámbialo a db (el nombre del servicio).

  2. Nginx no encuentra los archivos (Error 404 o 500):

    • Causa: La ruta root en app.conf no coincide con el volumen montado.

    • Solución: Asegúrate de que el volumen de nginx tenga .:/var/www y que root /var/www/public.

  3. El puerto 8000 ya está ocupado:

    • Solución: Cambia el mapeo de puertos en docker-compose.yml a "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:8000

  • Los 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

Entradas más populares de este blog

12. Hola Mundo en Docker.

11¿Qué es Docker? y ¿Por qué debo saberlo?

14. Publish and Detached modes