Laravel Sail en Docker: qué crea y su compose.yaml pieza a pieza
Hola, bienvenido. Empezamos la segunda sección del curso, y en esta lección vamos a crear un proyecto Laravel 13 con Laravel Sail y a abrir su compose.yaml pieza a pieza. Laravel Sail es Docker por debajo: un archivo compose.yaml con los servicios de tu aplicación y un script, vendor/bin/sail, que traduce sus comandos a docker compose. Si has montado tasks/ a mano en la primera sección, vas a reconocer casi todo lo que hay en ese archivo, y lo poco que cambia tiene un motivo que ya conoces.
Para seguir la lección necesitas lo mismo que hasta ahora: Docker en marcha y una terminal, que en Windows es la de WSL2, con el proyecto dentro de tu carpeta de Linux. No necesitas PHP ni Composer en tu máquina. Lo que sí necesitas son los puertos 80, 3306 y 5173 libres (el último es el de Vite), y tasks/ publica su MySQL en el 3306 desde la lección Redes y puertos en Docker Compose, y los comandos del día a día. Así que, si lo tienes levantado, páralo antes desde su carpeta:
Crear el proyecto con laravel.build
La forma oficial de crear un proyecto nuevo con Sail es un script que se descarga de laravel.build y se ejecuta con bash. Antes de lanzar cualquier curl | bash conviene leer lo que vas a ejecutar, y aquí además vas a reconocer lo que hace. Si quitas el | bash, curl te enseña el script en la terminal sin ejecutar nada:
Esta es la parte que nos interesa, tal como la devuelve en octubre de 2026:
Fíjate en que no hay nada que no hayamos visto. Es un docker run --rm como los de la lección Comandos básicos de Docker: docker pull, docker run, docker ps, docker exec y docker logs: un contenedor efímero con PHP y Composer que monta tu carpeta actual en /opt con un bind mount, ejecuta laravel new, instala Sail con Composer y lanza sail:install --with=mysql, que escribe el compose.yaml y ajusta el .env. Ese contenedor lleva PHP 8.4, pero solo sirve para generar el proyecto: la aplicación correrá con la imagen de PHP 8.5 que construye Sail. Después, el script descarga la imagen de MySQL y construye la de la aplicación.
Antes de todo eso, el script comprueba con docker info que Docker está arrancado, y al final ejecuta chown -R $USER: . con sudo. ¿Por qué? Porque el contenedor ha creado todos los archivos como root, que es el problema de los archivos de root de la lección Volúmenes y bind mounts en Docker Compose: persistir MySQL y editar el código sin reconstruir. Por eso te pide la contraseña al terminar: para dejar el proyecto a tu nombre.
Con with=mysql le pedimos solo MySQL. Redis lo vamos a añadir en la siguiente lección con sail:add, para ver qué cambia en el archivo cuando se añade un servicio. Ahora sí, lo ejecutamos desde la carpeta donde tengas tasks/:
La primera vez tarda unos minutos, porque descarga las imágenes y construye la de la aplicación. Si quieres ver la instalación con más detalle o con otros servicios, la tienes en el artículo Laravel Sail, dockeriza tu entorno de desarrollo Laravel (se abre en una pestaña nueva). Y si lo que tienes es un proyecto que ya existe, el script hace los mismos 2 pasos que harías tú: composer require laravel/sail --dev y php artisan sail:install, como cuenta Instalar Laravel Sail en un proyecto existente (se abre en una pestaña nueva).
- 02El alias sail y lo que ha aparecido en Docker
- 03El compose.yaml de Sail pieza a pieza
- 04Lo que Sail hace distinto: sin Nginx ni PHP-FPM
¿Ya lo habías pedido o entras desde otro dispositivo? Escribe el mismo email: recuperas tu acceso y tu avance.
Al entrar desde el enlace te apuntamos a los avisos de cursos gratuitos. Te das de baja cuando quieras.
¿Ya tienes cuenta? Entra