Skip to content

🐳 Entorno Docker del Proyecto Laravel

Este documento describe con profundidad la arquitectura Docker empleada para desplegar Laravel 11.x utilizando contenedores basados en Alpine Linux. Se detalla cómo se estructura, configura e interconecta cada contenedor del proyecto, cumpliendo con los criterios técnicos exigidos en la UF2 (implementación técnica) y la UF4 (documentación detallada y clara) del módulo M08.


🧱 Arquitectura general del entorno

El entorno Docker se compone de tres servicios principales:

  • mysql (base de datos)
  • laravel (aplicación PHP-FPM)
  • nginx (servidor web)

Todos los contenedores comparten una red interna y, en el caso de Laravel y NGINX, también un volumen compartido con el código fuente.


📦 Servicios definidos en docker-compose.yml

version: '3.8'

services:
  mysql:
    image: alpine:latest
    container_name: mysql
    command: tail -f /dev/null
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - net-m8

  laravel:
    build:
      context: .
      dockerfile: Dockerfile-laravel
    container_name: laravel
    volumes:
      - josue-app:/var/www/html
    networks:
      - net-m8
    depends_on:
      - mysql

  nginx:
    image: alpine:latest
    container_name: nginx
    command: tail -f /dev/null
    ports:
      - "8080:80"
    volumes:
      - josue-app:/var/www/html
      - ./docs/nginx.conf:/etc/nginx/nginx.conf
    networks:
      - net-m8
    depends_on:
      - laravel

volumes:
  josue-app:
  mysql-data:

networks:
  net-m8:
    driver: bridge

🔍 Explicación de las secciones

  • services: define los contenedores.
  • build: indica que el contenedor laravel se construye desde un Dockerfile personalizado.
  • depends_on: garantiza que un servicio espere a que otro esté listo.
  • volumes: crea almacenamiento persistente (mysql-data) y compartido (josue-app).
  • networks: permite la comunicación directa entre contenedores por nombre.

🧩 Detalle técnico de cada servicio

🔵 Servicio mysql

  • Imagen: alpine:latest, mínima y ligera.
  • Instalación manual: Se instala mariadb al acceder al contenedor.
  • Persistencia: Se guarda la base de datos en el volumen mysql-data.
  • Conectividad: Forma parte de la red net-m8 para comunicarse con Laravel.
  • Comando: tail -f /dev/null mantiene el contenedor activo.

🟣 Servicio laravel

  • Dockerfile personalizado: Se instala PHP 8.4, Composer, Laravel 11, Breeze, Node.js y PHP-FPM manualmente.
  • Código fuente: Se guarda en /var/www/html.
  • Volumen compartido: josue-app sincroniza los archivos con NGINX.
  • Comunicación: Expone el socket PHP-FPM en el puerto 9000, al que NGINX accede internamente.

🟢 Servicio nginx

  • Imagen base: Alpine Linux con NGINX instalado manualmente.
  • Puerto expuesto: 8080 del host → 80 del contenedor.
  • Configuración modular: Lee el archivo docs/nginx.conf para configurar el servidor.
  • Sirve Laravel: Utiliza fastcgi_pass laravel:9000 para delegar a PHP-FPM.

📂 Estructura del proyecto

m8_proyecto/
├── docker-compose.yml
├── Dockerfile-laravel
├── docs/
│   ├── index.md
│   ├── laravel-php-fpm.md
│   ├── mysql.md
│   ├── nginx.md
│   ├── docker.md
│   ├── git.md
│   └── mkdocs.md
└── mkdocs.yml
  • Todos los archivos de documentación están en docs/ y serán desplegados en GitLab Pages mediante MkDocs.

🧪 Comandos esenciales para desarrollo

🧹 Levantar el entorno desde cero:

docker compose down -v  # Elimina contenedores y volúmenes
docker compose up -d --build  # Reconstruye y levanta todo

🔍 Consultar contenedores activos:

docker ps

🛠️ Entrar a cada contenedor:

docker exec -it laravel sh
docker exec -it mysql sh
docker exec -it nginx sh

🔁 Reiniciar servicios:

docker restart laravel

📌 Buenas prácticas y recomendaciones

  • Volúmenes compartidos: evita errores entre Laravel y NGINX.
  • Red dedicada: permite comunicación por nombre (ej. laravel, mysql).
  • Documenta cada paso: útil para reproducir el entorno o desplegar en otro equipo.
  • Evita usar root dentro de contenedores en producción.
  • Agrega HTTPS con certbot o configuración NGINX si se expone públicamente.

✅ Checklist evaluación UF2/UF4

Criterio Cumplido
docker-compose.yml bien estructurado
Servicios separados: Laravel, MySQL, NGINX
Uso correcto de volúmenes y red interna
Aislamiento total del entorno host
Documentación técnica clara y completa