Desarrollo Web 5-8 minutos

Laravel Sail: el entorno de desarrollo con Docker para Laravel 13, paso a paso

Diego Cortés
Diego Cortés
Full Stack Developer & SEO Specialist
Compartir:
Laravel Sail: el entorno de desarrollo con Docker para Laravel 13, paso a paso

Laravel Sail es el entorno de desarrollo con Docker oficial de Laravel y llega incluido en Laravel 13: con un solo comando levantas PHP, MySQL y Redis sin necesitar experiencia previa con Docker. Detrás no hay magia, sino un archivo compose.yaml y un script sail en la raíz del proyecto.

Qué es Laravel Sail y por qué usarlo

Sail es, en esencia, el archivo compose.yaml y el script sail que Laravel guarda en la raíz de tu proyecto. El script actúa como un envoltorio que traduce comandos familiares —artisan, composer, npm— en llamadas a los contenedores Docker correspondientes. Así, todo el equipo trabaja con la misma interfaz de siempre y Docker queda en segundo plano.

Docker sin fricción: compose.yaml + script sail

No hace falta dominar Docker para sacarle partido. Sail define los servicios en compose.yaml y el script sail se encarga de arrancarlos, conectarlos entre sí y ejecutar comandos dentro del contenedor de la aplicación. Si alguna vez has peleado con volúmenes, redes o imágenes mal configuradas, Sail elimina esa capa de fricción: los contenedores se construyen y levantan con una sola orden.

Entornos reproducibles para todo el equipo

Al estar versionado junto al código, compose.yaml garantiza que todo el mundo desarrolle con las mismas versiones de PHP, MySQL y Redis, sin importar si usa Linux, macOS o Windows con WSL2. Desaparece el clásico "en mi máquina funciona": si la configuración vive en el repositorio, la reproducibilidad es automática y el onboarding de gente nueva se reduce a clonar y ejecutar un comando.

Instalación: Docker y primer proyecto con Sail

El único requisito previo es tener Docker instalado y en marcha (Docker Desktop en macOS y Windows, o el motor de Docker en Linux). A partir de ahí, crear un proyecto con Sail es directo y no requiere configuración manual.

Crear un proyecto nuevo con Sail incluido

La vía oficial crea el proyecto y deja Sail configurado con los servicios que elijas durante la instalación:

curl -s https://laravel.build/example-app | bash
cd example-app
./vendor/bin/sail up -d

El instalador te deja marcar los servicios que necesites: mysql, pgsql, mariadb, redis, memcached, meilisearch, minio, selenium y mailpit. Con sail up -d la aplicación queda disponible en http://localhost con PHP, MySQL 8 y Redis funcionando, sin tocar nada más.

Añadir Sail a un proyecto Laravel existente

Si ya tienes un proyecto, Sail se instala como paquete de desarrollo y publica su configuración con dos comandos:

composer require laravel/sail --dev
php artisan sail:install

Después arranca el entorno con ./vendor/bin/sail up -d. Sail no reescribe tu código: añade el compose.yaml, el script sail y un .env de ejemplo adaptado a los contenedores, con los puertos, credenciales y hosts de los servicios apuntando a las direcciones internas de Docker.

El flujo diario con el comando sail

Una vez en marcha, Sail se antepone a los comandos que ya conoces para ejecutarlos dentro del contenedor de la aplicación, con la versión de PHP y las extensiones del proyecto.

sail up, sail artisan y sail composer

./vendor/bin/sail up -d            # levantar el entorno en segundo plano
./vendor/bin/sail artisan migrate  # migraciones dentro del contenedor
./vendor/bin/sail composer require laravel/telescope
./vendor/bin/sail npm run dev      # assets con el Node del contenedor

Para escribir menos, añade un alias en tu shell: alias sail='[ -f sail ] && sh sail || sh vendor/bin/sail'. También hay comandos útiles como sail shell, para abrir una terminal dentro del contenedor, o sail down, para detener todos los servicios cuando terminas la jornada.

Servicios disponibles: MySQL, Redis, Mailpit, Meilisearch y más

Además de PHP y el servidor web, Sail incluye servicios listos para usar: MySQL 8, PostgreSQL, MariaDB, Redis, Memcached, Meilisearch para búsquedas, MinIO como S3 local, Selenium para tests de navegador y Mailpit para capturar los correos que envía la aplicación en desarrollo (visibles en http://localhost:8025). Se eligen al crear el proyecto o se añaden después editando compose.yaml.

Personalizar Sail: servicios y versión de PHP

El entorno se adapta al proyecto editando compose.yaml y reconstruyendo la imagen. Es el mecanismo que usas tanto para cambiar de versión de PHP como para ajustar los servicios a lo que realmente necesita la aplicación.

Cambiar la versión de PHP (hasta 8.5)

La versión de PHP se define en el argumento de build del contenedor laravel.test. Para subir a PHP 8.5, el estándar en los proyectos Laravel de 2026:

laravel.test:
    build:
        args:
            PHP_VERSION: '8.5'

Después de editar, reconstruye la imagen con ./vendor/bin/sail build --no-cache y levanta de nuevo el entorno. Cambiar la versión de PHP es uno de los motivos más habituales para tocar Sail, y el proceso es siempre el mismo: editar, construir, arrancar.

Añadir y quitar servicios en compose.yaml

Los servicios se añaden o eliminan como bloques de compose.yaml. Si tu proyecto no usa Redis, borra su definición; si empiezas a necesitar Meilisearch, añade su servicio y declara la dependencia en el contenedor laravel.test. Tras cada cambio, reconstruye y reinicia para que los contenedores reflejen la nueva configuración sin arrastrar servicios muertos.

Problemas comunes y soluciones

Aunque Sail oculta gran parte de la complejidad de Docker, hay tres problemas típicos que casi todo el mundo encuentra alguna vez.

Permisos de storage y puertos ocupados

El error de permisos en storage/ y bootstrap/cache/ aparece sobre todo en Linux, cuando los ficheros se crean con otro usuario. La solución habitual es ajustar el propietario del directorio del proyecto o ejecutar los comandos a través de sail, que ya corre con el usuario correcto. Los puertos ocupados —el 3306 de MySQL o el 80 suelen estar tomados por otros servicios locales— se resuelven cambiando la asignación de puertos en compose.yaml, por ejemplo 3307:3306.

Rendimiento en macOS y Windows (WSL2)

En macOS, Docker Desktop virtualiza Linux y el rendimiento de los ficheros depende de cómo se monte el proyecto; mantener el código fuera de rutas problemáticas y dar memoria suficiente a Docker ayuda. En Windows, la configuración recomendada es WSL2 con el proyecto dentro del sistema de ficheros de Linux y no en /mnt/c, porque el cruce entre sistemas de ficheros ralentiza mucho las operaciones de lectura y escritura.

Sail frente a Laradock, Herd y FrankenPHP

Sail no es la única opción. Laradock ofrece muchos más servicios y un control fino, pero a costa de configuración manual y de una curva de aprendizaje pronunciada. Herd es el entorno nativo de Laravel: sin Docker, más ligero y rápido para desarrollo local en macOS y Windows, ideal cuando no necesitas contenedores. FrankenPHP, por su parte, es un servidor de aplicaciones PHP escrito en Go que brilla en producción y también sirve para desarrollo, sobre todo si quieres probar el mismo runtime que usarás al desplegar. La regla práctica: Sail cuando quieras un entorno Docker estandarizado sin fricción, Herd cuando prefieras lo nativo y FrankenPHP cuando el foco esté en producción.

Conclusión

Laravel Sail convierte Docker en un detalle de configuración: un compose.yaml y un script que tu equipo comparte sin manual de instrucciones. Instálalo en tu proyecto, personaliza la versión de PHP y los servicios, y olvídate de los entornos rotos. Si quieres seguir mejorando tu flujo de trabajo con Laravel 13, revisa el resto de guías de desarrollo web del blog.

Categorías