laravel/sail
Laravel Sail offers a Docker-powered local development environment for Laravel on macOS, Windows (WSL2), and Linux. With a simple CLI and no extra dependencies beyond Docker, it lets you spin up a full dev stack quickly—even without Docker experience.
## Getting Started
### Minimal Setup
1. **Installation**:
```bash
composer require laravel/sail --dev
sail build --no-cache
sail up
sail command is a CLI wrapper for Docker Compose, automatically generated in your project root after installation.First Use Case:
sail artisan migrate
sail artisan serve
http://localhost (default port: 80).Key Files:
docker-compose.yml (or compose.yaml): Defines services (PHP, MySQL, Redis, etc.)..env: Environment variables for Sail (e.g., SAIL_MYSQL_ROOT_PASSWORD).sail: The CLI script (auto-generated; edit .env to customize).Development Loop:
# Start containers (detached mode)
sail up -d
# Run Laravel commands inside containers
sail artisan queue:work
sail artisan test
# Access a shell
sail shell # (as Laravel user)
sail root-shell # (as root)
Service Management:
sail up mysql redis
sail down mysql
.env (e.g., SAIL_MYSQL_PORT=3307).Artisan Command Aliases:
sail migrate # Equivalent to `sail artisan migrate`
sail tinker # Equivalent to `sail artisan tinker`
Database Management:
sail mysql:reset
sail postgres:reset
sail mysql:dump > backup.sql
sail mysql:import < backup.sql
Testing:
sail test --browser
sail pest --browser
sail artisan test for PHPUnit.Custom Commands:
sail script by adding aliases to ~/.bashrc or .env:
SAIL_EXTRA_COMMANDS="alias sail:queue='sail artisan queue:work --daemon'"
IDE Integration:
.env:
SAIL_XDEBUG_ENABLED=true
SAIL_XDEBUG_PORT=9003
CI/CD:
services:
mysql:
image: mysql:8.4
env:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: laravel
ports:
- 3306:3306
sail:
image: ghcr.io/laravel/sail:8.11
ports:
- 80:80
Custom Dockerfiles:
docker/php/Dockerfile in your project root.RUN docker-php-ext-install gd avif
Environment Variables:
SAIL_ENVIRONMENT=local
SAIL_APP_ENV=local
sail artisan config:clear to reload .env in containers.Volume Mounts:
docker-compose.yml:
volumes:
- ./:/var/www/html
- ./storage:/var/www/html/storage
- ./vendor:/var/www/html/vendor
Service Extensions:
docker-compose.yml:
services:
typesense:
image: typesense/typesense:0.27.1
ports:
- "8108:8108"
Port Conflicts:
80 or 3306 already in use..env:
SAIL_HTTP_PORT=8080
SAIL_MYSQL_PORT=3307
sail ps to check running containers.Permission Denied:
docker group or use sail root-shell to fix permissions:
sail root-shell
chown -R laravel:laravel /var/www/html/storage
Xdebug Not Working:
.env settings:
SAIL_XDEBUG_ENABLED=true
SAIL_XDEBUG_PORT=9003
XDEBUG_CONFIG="client_host=host.docker.internal"
sail tail -f /var/www/html/storage/logs/laravel.log
MySQL Connection Errors:
SQLSTATE[HY000] [2002] No such file or directory.SAIL_MYSQL_PORT matches your .env DB_PORT and container is running:
sail mysql:status
Node/Yarn Issues:
sail npm install
sail yarn install
sail corepack enable
Volume Corruption:
sail rm -vf # Removes all containers and volumes
sail up -d
PHP Version Mismatch:
.env:
SAIL_PHP_VERSION=8.2
sail --help.RabbitMQ/Redis Health Checks:
sail up -d redis rabbitmq
sleep 5 # Wait for services to be ready
Logs:
sail logs mysql
sail logs -f # Follow logs in real-time
Container Inspection:
sail ps
sail exec mysql mysql -u root -p
Networking:
sail mysql:status # Check if MySQL is reachable
host.docker.internal to access host services from containers.Custom Scripts:
docker-compose.yml:
services:
app:
volumes:
- ./scripts:/var/www/html/scripts
sail php scripts/deploy.php
.env Overrides:
.env with docker-compose.yml. Ensure consistency:
# .env
DB_HOST=mysql
SAIL_MYSQL_PORT=3306
Service Aliases:
.env:
# Correct:
DB_HOST=mysql
REDIS_HOST=redis
Podman Support:
SAIL_DOCKER_BINARY=podman in .env for Podman:
SAIL_DOCKER_BINARY=podman
ARM/M1 Support:
SAIL_ARCH=amd64
Custom Docker Binaries:
How can I help you explore Laravel packages today?