Crear Web Laravel con Docker y MySQL: Guía Fácil (Sin Sail)

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

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 tu Dockerfile.

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).

Nosotros utilizamos cookies

Este sitio utiliza cookies para mejorar su experiencia de usuario.

Puedes aceptar todas las cookies pulsando en el botón de "Aceptar todas", rechazar todas las cookies pulsando el botón de "Rechazar cookies" o configurar manualmente usando el botón de "más opciones"

Para más información visita nuestra Política de cookies

Personaliza las Cookies

Estas cookies son necesarias para que el sitio web funcione y no se pueden desactivar en nuestros sistemas. Usualmente están configuradas para responder a acciones hechas por tí para recibir servicios, tales como ajustar tus preferencias de privacidad, iniciar sesión en el sitio, o llenar formularios. Puedes configurar tu navegador para bloquear o alertar la presencia de estas cookies, pero algunas partes del sitio web no funcionarán. Estas cookies no guardan ninguna información personal identificable.

Estas cookies nos permiten contar las visitas y fuentes de circulación para poder medir y mejorar el desempeño de nuestro sitio. Nos ayudan a saber qué páginas son las más o menos populares, y ver cuántas personas visitan el sitio. Toda la información que recogen estas cookies es agregada y, por lo tanto, anónima.