🐳 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 contenedorlaravelse 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
mariadbal acceder al contenedor. - Persistencia: Se guarda la base de datos en el volumen
mysql-data. - Conectividad: Forma parte de la red
net-m8para comunicarse con Laravel. - Comando:
tail -f /dev/nullmantiene 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-appsincroniza 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:
8080del host →80del contenedor. - Configuración modular: Lee el archivo
docs/nginx.confpara configurar el servidor. - Sirve Laravel: Utiliza
fastcgi_pass laravel:9000para 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 | ✅ |