🐳 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 contenedorlaravel
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 | ✅ |