Laravel Sail: the best way to start developing with Laravel
Tags: laravel, php, docker
Published: 2021-03-01 17:13:42

[🇪🇸 Artículo en español](https://victorfalcon.es/laravel-sail-en-espanol/)

Setting up a local development environment with Laravel is now a matter of minutes thanks to [Sail](https://laravel.com/docs/8.x/sail). We see how to build a project from scratch and some essential commands.

---

Before, depending on our operating system, setting up a local development environment meant making certain decisions.

If we were using Mac we could use [Valet](https://laravel.com/docs/8.x/valet) and in a matter of minutes have a more or less functional development environment, but Valet did not work on Windows or Linux.

The other option was to use [Homestead](https://laravel.com/docs/8.x/homestead), which is not quick to assemble, or docker containers that we had to create one by one to meet our needs and prepare our development environment.

Now, with Laravel Sail, all of this has changed, and we can have a working development environment, whatever our operating system, with just one command.

---

## 📹 Laravel Sail, from scratch (Video in Spanish)
> [**Subscribe to my Youtube Channel** 😘](http://bit.ly/VictorFalconYoutube)

{% youtube hMeVyt4JMZw %}

---

## 📃 Laravel Sail, from scratch.

### How to start a project from scratch?

The only thing we need before we start, is to install [Docker Desktop](https://www.docker.com/products/docker-desktop) on our machine and, in case of Windows, use *Windows Subsystem for Linux 2 (WSL2)*.

Then, from the terminal and in the directory where we want to download Laravel, we execute the following command naming the project.

```bash
# You can replace example-app with your app name
curl -s "https://laravel.build/example-app" | bash
```

This will download everything you need to set up our local development environment and start working with Laravel. At the end of the process, it will ask you for the `sudo` password to be able to configure the permissions of certain folders within the project.

As soon as the command finish, if we see the output, it tells us to enter to the directory and run the containers with:

```bash
cd example-app && ./vendor/bin/sail up
```

With this, the development environment is up and running. By default, we will have:

- A container for the application itself with PHP 8 named with `laravel.test`.
- Another for the database in MySQL although, there is an option to use Postgres.
- A Redis container for the cache.
- And finally, Selenium to run the Laravel Dusk browser tests in case we need it.

### Before you start, configure the alias

Keep in mind that, since our project is now inside a Docker container, we have to execute all commands inside this container, which is where the expected PHP version is located among other things. It may seem complicated, but it's not.

The first thing we have to do, although it is optional, is to configure an alias to run, more quickly, the Sail executable.

What we will do is add, in the file `.zshrc` or `.bashrc` the following:

```bash
alias sail='bash vendor/bin/sail'
```

Once the alias is configured we can work with sail simply using `sail`, from the terminal, instead of `./vendor/bin/sail`.

### Start or stop the servers

To start the server we simply have to run `sail up` to see the output log in the foreground, or `sail up -d` to run it in the background in "daemon" mode.

When we want to stop the containers we will only have to write `sail  down`. As you can see, they are exactly the same commands that we use with Docker. In fact, if you write you will simply `sail` be pitching `docker ps`. It's a simple way to work on a day-to-day basis and to get away from Docker a bit.

### Running commands with artisan

When executing any command we are interested in doing it inside the container and for this, we must work with `sail` instead of using it directly `artisan` or `php artisan` as we usually do.

```bash
# Run migration locally
php artisan migrate

# Run migrations with Laravel Sail
sail artisan migrate
```

The same happens with PHP, Composer and Node / NPM

```bash
# Install Dusk, with Laravel Sail
sail composer require --dev laravel/dusk

# Print Laravel Sail PHP version
sail php --version

# Compile production assets with NPM in Laravel Sail
sail npm run prod
```

As you can see, it is usually prepared to work with any of these components as we usually do, with the only difference that we must add `sail` at the beginning.

### Run unit tests

With Sail, we can run the PHPUnit unit tests without any problem from the first second. We will simply do:

```bash
sail test

# Same as
sail artisan test
```

### Run navigation tests with Laravel Dusk

Running the navigation tests takes more configuration than the unit tests. In this case we need a Selenium container and the necessary Chrome drivers.

To achieve this we only have to uncomment the following block of the file docker-compose.yml:

```yml
selenium:
    image: 'selenium/standalone-chrome'
    volumes:
        - '/dev/shm:/dev/shm'
    networks:
        - sail
```

And add the Selenium dependency in the container `laravel.test`:

```bash
depends_on:
    - mysql
    - redis
    - selenium
```

With this, and obviously installing the library `laravel/dusk`, we will be able to launch the tests with `sail dusk`.

In this case, although it may seem the same, the command `sail artisan dusk` is not equivalent and would fail to execute.

### Customize Laravel Dusk

Finally, you have to know that you can configure the containers as you want by publishing the configuration files.

```bash
sail artisan sail:publish
```

> Remember that every change you make you will have to rebuild the containers with `sail build --no-cache`