Configurar Laravel Sail en cualquier proyecto Laravel

Video thumbnail

Ya sabemos como configurar MySQL en nuestro proyecto en Laravel, vamos a seguir hablando sobre el ecosistema de Laravel.

A diferencia de otros frameworks que requieren que el desarrollador cree manualmente los Dockerfiles y docker-compose.yml, Laravel es disruptivo: proporciona una herramienta llamada Sail que se encarga de crear y gestionar todo el entorno Docker por nosotros.

¿Qué es Laravel Sail? 

Laravel Sail es una interfaz de línea de comandos liviana para interactuar con el entorno de Docker el cual es ahora el ambiente predeterminado para desarrollar en Laravel. Sail proporciona un excelente punto de partida para crear una aplicación Laravel con PHP, MySQL y Redis y lo mejor de todo, es que, no se necesita tener experiencia previa en Docker.

En esencia, Sail es el archivo docker-compose.yml y el script de navegación que se almacena en la raíz de su proyecto. El script de navegación proporciona una CLI con métodos convenientes para interactuar con los contenedores de Docker definidos por el archivo docker-compose.yml.

Sail es el entorno de desarrollo más reciente de Laravel que surge a partir de Laravel en la versión 8. y viene a equipararse con otras soluciones oficiales como Homestead para Windows y Valet para MacOS y esfuerzos comunitarios como Laragon (particularmente el que yo uso), Laradock y Vessel.

Laravel Sail se basa en Docker, una tecnología que aprovecha los contenedores para empaquetar aplicaciones para que puedan ejecutarse rápida y fácilmente en cualquier sistema operativo.

El futuro de Sail parece ser brillante, ya que la documentación de Laravel ya lo presenta como la forma preferida de instalar y ejecutar proyectos de Laravel localmente, un lugar que Homestead y Valet ocuparon durante años.

Laravel Sail es compatible con macOS, Linux y Windows (a través de WSL2).

Podemos emplear Laravel Sail para en cualquier proyecto en Laravel; para esto vamos a seguir la documentación oficial en la cual tenemos los pasos.

Laravel Sail es una interfaz de línea de comandos liviana para interactuar con el entorno de desarrollo Docker predeterminado de Laravel. Sail proporciona un excelente punto de partida para crear una aplicación Laravel usando PHP, MySQL y Redis sin requerir experiencia previa en Docker.

Cualquier proyecto en Laravel que sea reciente puede usar Sail

Lo primero que necesitamos, es tener el proyecto en Laravel, en mi caso, para ponerte en contexto tengo proyecto en Windows, que los trabajo con Laragon (nada de Sail) y en una Mac con Laravel Sail; son los mismos proyectos pero ejecutándose en ambientes diferentes.

Laravel Sail, una CLI liviana para interactuar con el entorno docker predeterminado de Laravel, lanzó recientemente una nueva actualización que le permite elegir qué servicios deben configurarse en el archivo docker-compose.yml de su proyecto. Algunas de las opciones incluyen MySQL, PostgresSQL, Redis, Memcached, Meilisearch, Selenium y Mailhog.

Un nuevo parámetro en el comando del instalador determina qué servicios debe incluir Laravel Sail. Por ejemplo:

$ curl -s "https://laravel.build/example-app?with=mysql,redis" | bash

Si no pasa la opción with, Sail configurará la pila predeterminada de MySQL, Redis, Meilisearch, Mailhog y Selenium, y esta nueva configuración le brinda un control más detallado.

Instalar Docker

Aunque no vamos a interactuar mucho con Docker, esta viene siendo una dependencia fundamental para poder trabajar con Sail; lo descargas desde la web oficial y lo instalas. En el caso de Windows, debes de tener habilitados aspectos como la virtualización, el subsistema Linux, entre otros, desde la web oficial de Docker, puedes obtener más información. También, disponemos de un Curso para Desarrolladores en Docker.

️ 1. Instalación de Laravel Sail Instalación de Sail en aplicaciones existentes

Para instalarlo, lo típico, instalamos Sail como un paquete normal en Laravel. Si está interesado en usar Sail con una aplicación Laravel existente, simplemente puede instalar Sail usando el administrador de paquetes Composer. Por supuesto, estos pasos asumen que su entorno de desarrollo local existente le permite instalar las dependencias de Composer:

$ composer require laravel/sail --dev

Es una dependencia de desarrollo, por eso el --dev

⚙️ 2. Inicialización de Sail: Instalar Sail en el proyecto

De momento, tenemos la dependencia en nuestro proyecto, pero tenemos un comando de artisan para que realice las modificaciones necesarias en nuestro proyecto:

$ php artisan sail:install

Al ejecutar este comando:

  • Sail pregunta por la base de datos: A diferencia de otros frameworks, Sail suele requerir una base de datos "real" (como MySQL) ya que SQLite funciona de manera interna y no tiene sentido ejecutarla en un contenedor aislado.
  • Sail descarga imágenes: Empezarás a ver las trazas de Docker, como la descarga de la imagen de Ubuntu y la configuración del entorno.

3. Levantamiento y Uso del Proyecto

Para que Sail cree los archivos de configuración de Docker (principalmente el docker-compose.yml), debemos ejecutar el comando sail:install.

Ya tenemos TODO listo, así que lo siguiente que hacemos es iniciar Sail con el comando de:

./vendor/bin/sail up   
  • Al ejecutar sail up, Docker crea y arranca el contenedor de la aplicación Laravel y el contenedor de MySQL.
  • Puedes verificar en Docker que la imagen y los contenedores están activos.

Puedes revisar tu .env y veras que ya Sail te crea un usuario por defecto en la base de datos que hayas seleccionado:

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=sail
DB_PASSWORD=password

En tu Docker puedes ver que el proyecto está corriendo:

Docker ejecutandose
Docker ejecutandose

Ejecución de Comandos (Migraciones)

Una vez que el proyecto está corriendo (ej. en http://laravel.test o similar), lo más probable es que falle indicando que la base de datos no está disponible o las tablas no existen.

Para ejecutar las migraciones (o cualquier comando de Artisan) dentro del contenedor, reemplazamos php artisan por sail artisan:

$ ./vendor/bin/sail artisan migrate

¿Por qué sail artisan? El comando sail se comunica con el contenedor de la aplicación, ejecutando el comando de Artisan dentro de ese entorno aislado. Si usáramos php artisan directamente, usaríamos el intérprete de PHP instalado localmente en la máquina.

Tras la migración, la aplicación debería cargar correctamente en el navegador, demostrando que está siendo servida por el entorno Docker gestionado por Sail.

Detener el Entorno

Para detener la aplicación y los contenedores, simplemente ejecuta:

$ sail down

O Control/Command + C en la terminal

Extra: Ejecutar en detached mode

Si quieres ejecutar tu proyecto en detached mode o lo que es lo mismo, que no se quede el proceso de la terminal ejecutando, si no que se ejecute en segundo plano, le pasas la opción de -d

$ ./vendor/bin/sail up -d

Extra:

Si ves un error como el siguiente al intentar iniciar Sail:

ERROR: 
        Can't find a suitable configuration file in this directory or any
        parent. Are you in the right directory?
        Supported filenames: docker-compose.yml, docker-compose.yaml, compose.yml, compose.yaml

Es que NO lo instalaste en tu proyecto:

$ php artisan sail:install

Y seguir los pasos señalados anteriormente.

Comandos básicos en Sail

En cuanto a la ejecución de comandos puedes usar tanto comandos de php, como de artisan y por supuesto, los que nos provee Sail gracias al paquete que instalamos anteriormente mediante docker-compose.

Es importante notar que, los programas que formen parte de Docker como MySQL o Redis o cualquier otra base de datos, debes de usar los comandos de sail en lugar de artisan básico; por ejemplo en vez de php artisan migrate, ejecuta sail artisan migrate.

Comandos básicos de docker-compose:

  • docker-compose ps | sail ps : ver los contenedores en ejecución.
  • docker-compose down | sail down : Ver los contenedores y eliminarlos.
  • docker-compose up | sail up: Correr los contenedores.
  • docker-compose up -d | sail up -d: Correr los contenedores en modo background.

Sobre Laravel Sail

Laravel Sail es un paquete que se instala mediante composer que ofrece una interfaz de línea de comandos; Sail, es otro de los entornos que tenemos a nuestra disposición para poder levantar o servir un proyecto en Laravel; utiliza Docker para ejecutar la aplicación pero ofrece una abstracción a los procesos de configuración de Docker que tendríamos que hacer manual si queremos usar esta herramienta como entorno de desarrollo en Laravel, por lo tanto, todo el proceso de configuración lo hace Sail por nosotros.

Sail permite configurar todo el proyecto sin necesidad de tener instalado prácticamente nada a nivel del sistema operativo, salvo Docker y puede que PHP, todo lo demás, es decir, servidor, base de datos y demás dependencias, se instala en Docker; para poder usar Sail puedes hacerlo sin problemas en Linux o Mac, en el caso de Windows, debes de activar y configurar el subsistema de Linux.

Sail es uno de mis servicios favoritos y lo uso en MacOS para desarrollar mis proyectos además de los proyectos de mis libros y cursos que desarrollo en dicho sistema operativo, es muy liviano y fácil de utilizar, no ofrece problemas en general y lo único que debes de tener en cuenta es apagar cualquier proceso que tengas en los puertos ocupados por Sail al levantar el servicio, que sería, el puerto 80 para el servidor o el 3306, estos puertos también los puedes cambiar para cada proyecto en Laravel con Sail o simplemente apagas otros servicios que tengas instalado a nivel del sistema operativo.

Acepto recibir anuncios de interes sobre este Blog.

Descubre Laravel Sail, el entorno de desarrollo basado en Docker para Laravel. Aprende a instalarlo y configurarlo en tus proyectos para trabajar con PHP, MySQL y Redis de forma sencilla, ¡incluso sin experiencia previa en Docker!

| 👤 Andrés Cruz

🇺🇸 In english