Crear tu Web Laravel con Docker y MySQL (¡Sin Sail!): Guía Fácil
¿Cansado de configurar PHP, MySQL y Nginx directamente en tu ordenador? ¿Quieres que tus proyectos Laravel funcionen igual de bien en cualquier máquina? ¡Docker es tu superhéroe! Con esta guía rápida, aprenderás a crear web Laravel con Docker de forma sencilla, incluyendo MySQL como base de datos, y te daremos un toque extra con Nginx y cómo añadir un microservicio común como Redis. Olvídate de los dolores de cabeza de las dependencias; con Docker para Laravel, todo es más fácil.
Únete a nuestra comunidad de DiscordÍndice
Paso 1: Prepara tu Proyecto Laravel y Docker
Antes de sumergirnos en el código de Docker, necesitamos tener Docker instalado y una base para nuestro proyecto Laravel.
Instala Docker y Crea tu Aplicación Laravel
Primero, asegúrate de tener Docker Desktop (que incluye Docker Compose) instalado en tu sistema. Es la herramienta mágica que nos permite empaquetar nuestras aplicaciones y sus servicios en "cajas" (contenedores) aisladas.
-
- Descarga Docker Desktop aquí: https://www.docker.com/products/docker-desktop/
Una vez instalado, abre tu terminal y crea un nuevo proyecto Laravel. Si ya tienes uno, ¡perfecto! Puedes saltarte este paso.
composer create-project laravel/laravel mi-web-docker
cd mi-web-docker
Ahora estamos dentro de la carpeta de nuestro proyecto. ¡Listo para el siguiente paso!
Paso 2: Define tus Servicios con Docker Compose
Aquí es donde le decimos a Docker qué "cajas" necesitamos para que nuestra web funcione: una para PHP
(donde está Laravel), otra para Nginx (nuestro servidor web) y otra para MySQL (nuestra base de datos). Usaremos un
archivo llamado docker-compose.yml para esto.
El Corazón de tu Entorno: docker-compose.yml
En la raíz de tu proyecto mi-web-docker, crea un archivo llamado docker-compose.yml y pega
este contenido. Este archivo es como el plano de construcción de todo nuestro entorno:
version: '3.8'
services:
# Servicio para nuestra aplicación Laravel (PHP-FPM)
app:
build:
context: . # Busca el Dockerfile en la carpeta actual
dockerfile: Dockerfile
image: laravel-app-image # Nombre de la imagen que crearemos
restart: unless-stopped # Se reinicia si se detiene inesperadamente
volumes:
- .:/var/www/html # Conecta la carpeta de tu proyecto con la del contenedor
networks:
- laravel-network # Para que se comunique con otros servicios
depends_on:
- db # Asegura que la base de datos se inicie antes que la app
# Servicio para el servidor web (Nginx)
nginx:
image: nginx:stable-alpine # Usamos la imagen oficial de Nginx (versión ligera)
restart: unless-stopped
ports:
- "8000:80" # Mapea el puerto 8000 de tu PC al puerto 80 del contenedor
volumes:
- .:/var/www/html # Conecta el código Laravel
- ./docker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf # Nuestra configuración de Nginx
networks:
- laravel-network
depends_on:
- app # Nginx necesita que PHP (app) esté listo
# Servicio para la base de datos (MySQL)
db:
image: mysql:8.0 # Usamos la imagen oficial de MySQL 8.0
restart: unless-stopped
environment: # Variables de entorno para MySQL
MYSQL_DATABASE: laravel_db # Nombre de la base de datos
MYSQL_ROOT_PASSWORD: root # Contraseña del usuario root
MYSQL_PASSWORD: password # Contraseña para el usuario 'laravel'
MYSQL_USER: laravel # Nombre del usuario para Laravel
volumes:
- dbdata:/var/lib/mysql # Guarda los datos de la DB para que no se pierdan
networks:
- laravel-network
# Volúmenes para persistir datos
volumes:
dbdata: # Aquí se guardarán los datos de MySQL
# Red para que los servicios se comuniquen
networks:
laravel-network:
driver: bridge # Tipo de red
Construyendo tu Contenedor PHP: Dockerfile
Necesitamos decirle a Docker cómo construir la "caja" de PHP para nuestra aplicación Laravel. Crea un
archivo llamado Dockerfile (sin extensión) en la raíz de tu proyecto, junto a
docker-compose.yml:
FROM php:8.2-fpm-alpine # Usamos una imagen ligera de PHP 8.2 con FPM
WORKDIR /var/www/html # Establece el directorio de trabajo dentro del contenedor# Instala extensiones de PHP y herramientas que Laravel necesita
RUN apk add --no-cache \
mysql-client \
git \
npm \
nodejs \
composer \
&& rm -rf /var/cache/apk/* # Limpia caché después de instalar# Instala la extensión PDO MySQL para la base de datos
RUN docker-php-ext-install pdo_mysql opcache
# Copia el ejecutable de Composer desde una imagen oficial
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
EXPOSE 9000 # El puerto que PHP-FPM usará para comunicarse con Nginx
CMD ["php-fpm"] # Comando para iniciar PHP-FPM cuando el contenedor arranque
Nginx: Tu Servidor Web para Laravel en Docker
Nginx será el "guardia de tráfico" que dirigirá las peticiones de tu navegador a nuestra aplicación
Laravel. Crea una carpeta llamada docker en la raíz de tu proyecto, y dentro de ella, otra llamada
nginx. Dentro de nginx, crea el archivo nginx.conf:
server {
listen 80; # Nginx escucha en el puerto 80 dentro del contenedor
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/html/public; # La carpeta 'public' de Laravel
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000; # Envía las peticiones PHP al servicio 'app' (PHP-FPM) en su puerto 9000
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php?$query_string; # Regla para las URLs de Laravel
gzip_static on;
}
}
Paso 3: ¡A Luchar! Levanta tu Entorno y Configura Laravel
Tenemos nuestros planos y definiciones. ¡Es hora de poner en marcha nuestro entorno Laravel Docker!
Arrancando Docker y Instalando Dependencias
Abre tu terminal en la raíz de tu proyecto (mi-web-docker) y ejecuta este comando. Esto construirá las
imágenes (si no las tienes) y levantará todos tus servicios en segundo plano:
docker-compose up -d --build
-
-
up: Inicia los servicios. -
-
d: Los ejecuta en segundo plano (detached), para que puedas seguir usando la terminal. -
-
-build: Fuerza a Docker a construir las imágenes. Haz esto siempre la primera vez o si cambias tuDockerfile.
Una vez que los contenedores estén funcionando (tardará un momento la primera vez), necesitamos instalar las
dependencias de Laravel y generar su clave de aplicación. Lo haremos dentro del contenedor
app:
docker-compose exec app composer install
docker-compose exec app php artisan key:generate
Conectando Laravel a tu Base de Datos MySQL
Laravel necesita saber cómo conectarse a nuestra base de datos MySQL que está en otro contenedor. Abre el archivo
.env en la raíz de tu proyecto y modifica las líneas de la base de datos para que queden así:
DB_CONNECTION=mysql
DB_HOST=db # ¡Importante! 'db' es el nombre del servicio en docker-compose.yml
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel
DB_PASSWORD=password
¡Casi listo! Ahora, ejecuta las migraciones de Laravel para crear las tablas en tu base de datos:
Bash
docker-compose exec app php artisan migrate
¡Felicidades! Abre tu navegador y ve a http://localhost:8000. Deberías ver la página de bienvenida de
Laravel. ¡Has logrado crear web con Docker Laravel sin Sail!
Un Extra: Añade un Microservicio Común (Redis)
¿Quieres añadir una caché rápida o colas a tu proyecto Laravel? ¡Redis es una excelente opción y es súper fácil de añadir con Docker!
Para integrar Redis, simplemente añade el siguiente servicio a tu archivo docker-compose.yml, debajo del
servicio db:
# ... (después del servicio 'db')
redis:
image: redis:alpine # Imagen oficial de Redis (versión ligera)
restart: unless-stopped
networks:
- laravel-network # Para que Laravel pueda comunicarse con él
Luego, en tu archivo .env de Laravel, actualiza la configuración de Redis:
REDIS_HOST=redis # 'redis' es el nombre del servicio en docker-compose.yml
REDIS_PASSWORD=null
REDIS_PORT=6379
Después de guardar los cambios en docker-compose.yml y .env, vuelve a levantar tus
contenedores para que Docker Compose reconozca el nuevo servicio:
docker-compose up -d --build
¡Y listo! Tu proyecto Laravel Docker ahora tiene Redis integrado, listo para ser usado por Laravel para caché o colas. Esto demuestra lo fácil que es optimizar entorno Laravel Docker añadiendo microservicios.
Conclusión
¡Lo lograste! Has aprendido a crear web Laravel con Docker y MySQL, sin depender de Laravel Sail, lo que te da un control total sobre tu entorno. Hemos configurado PHP-FPM, Nginx y MySQL usando Docker Compose, y hasta hemos añadido Redis como un microservicio extra.
Dominar esta configuración te permite:
-
- Consistencia: Tu entorno de desarrollo será idéntico en cualquier máquina.
-
- Aislamiento: Evita conflictos de versiones entre tus proyectos o con tu sistema operativo.
-
- Control Total: Personaliza cada aspecto de tu stack de desarrollo.
-
- Eficiencia: Levanta y detén tu entorno con comandos sencillos.
Este tutorial Laravel Docker es el inicio de tu viaje para mejorar desarrollo Laravel Docker y convertirte en un experto en contenedores. ¡Experimenta, construye y sigue aprendiendo!
Preguntas Frecuentes
Sail es genial para empezar muy rápido, pero esta configuración manual te da un control más profundo, es más ligera (sin servicios predeterminados que quizás no uses) y te ayuda a entender mejor cómo funciona Docker por debajo, lo que es invaluable para depurar o personalizar.
Simplemente ejecuta docker-compose down en la terminal desde la raíz de tu proyecto. Esto detendrá y eliminará los contenedores y redes. Si quieres que los datos de la base de datos persistan, el volumen dbdata se encargará de ello.
No. Una de las grandes ventajas de Docker es que todas las dependencias (PHP, Composer, Node.js, MySQL, Nginx) viven dentro de los contenedores. Solo necesitas Docker Desktop en tu máquina.
Puedes añadirla a tu Dockerfile en la sección RUN apk add --no-cache o usando docker-php-ext-install si es una extensión oficial de PHP. Después de modificar el Dockerfile, ejecuta docker-compose up -d --build para reconstruir tu contenedor app.
El volumen dbdata que configuramos en docker-compose.yml se encarga de persistir los datos de tu base de datos. Si detienes los contenedores (docker-compose down) y luego los vuelves a levantar (docker-compose up -d), tus datos seguirán ahí. Si quieres una base de datos completamente limpia, puedes usar docker-compose down -v (con -v para eliminar volúmenes también).