コンテンツへスキップ

Laravel Sail

イントロダクション

Laravel Sailは、LaravelのデフォルトDocker開発環境を操作するための、軽量なコマンドラインインターフェイスです。Sailは、PHP、MySQL、Redisを使用してLaravelアプリケーションを構築するための素晴らしい出発点となり、Dockerの経験は不要です。

Sailの心臓部は、プロジェクトのルートに保存されるdocker-compose.ymlファイルとsailスクリプトです。sailスクリプトは、docker-compose.ymlファイルで定義されているDockerコンテナを操作するための便利なメソッドを備えたCLIを提供します。

Laravel Sailは、macOS、Linux、およびWindows(WSL2経由)でサポートされています。

インストールと設定

Laravel Sailは、すべての新しいLaravelアプリケーションに自動的にインストールされるため、すぐに使用を開始できます。新しいLaravelアプリケーションを作成する方法については、お使いのオペレーティングシステム用のLaravelのインストールマニュアルを参照してください。インストール中に、アプリケーションが操作するSailがサポートするサービスを選択するように求められます。

既存アプリケーションへのSailのインストール

既存のLaravelアプリケーションでSailを使用したい場合は、Composerパッケージマネージャを使用してSailをインストールするだけです。もちろん、この手順は、既存のローカル開発環境でComposerの依存パッケージがインストールできることを前提としています。

1composer require laravel/sail --dev

Sailをインストールした後、sail:install Artisanコマンドを実行します。このコマンドは、Sailのdocker-compose.ymlファイルをアプリケーションのルートに公開し、Dockerサービスに接続するために必要な環境変数で.envファイルを変更します。

1php artisan sail:install

最後に、Sailを起動します。Sailの使用方法についてさらに学ぶには、このドキュメントの残りの部分を引き続きお読みください。

1./vendor/bin/sail up

Docker Desktop for Linuxを使用している場合は、docker context use defaultコマンドを実行して、defaultのDockerコンテキストを使用する必要があります。

サービスの追加

既存のSailインストールにサービスを追加したい場合は、sail:add Artisanコマンドを実行します。

1php artisan sail:add

Devcontainerの使用

Devcontainer内で開発したい場合は、sail:installコマンドに--devcontainerオプションを指定します。--devcontainerオプションは、sail:installコマンドに、デフォルトの.devcontainer/devcontainer.jsonファイルをアプリケーションのルートに公開するように指示します。

1php artisan sail:install --devcontainer

Sailイメージの再構築

イメージのすべてのパッケージとソフトウェアが最新であることを確認するために、Sailイメージを完全に再構築したい場合があります。これはbuildコマンドを使用して実現できます。

1docker compose down -v
2 
3sail build --no-cache
4 
5sail up

シェルエイリアスの設定

デフォルトでは、Sailコマンドはすべての新しいLaravelアプリケーションに含まれているvendor/bin/sailスクリプトを使用して呼び出します。

1./vendor/bin/sail up

しかし、Sailコマンドを実行するためにvendor/bin/sailと繰り返しタイプする代わりに、Sailのコマンドをより簡単に実行できるシェルエイリアスを設定できます。

1alias sail='sh $([ -f sail ] && echo sail || echo vendor/bin/sail)'

これを常に利用できるようにするために、~/.zshrc~/.bashrcなど、ホームディレクトリにあるシェル設定ファイルにこれを追加し、シェルを再起動してください。

シェルエイリアスを設定したら、sailと入力するだけでSailコマンドを実行できます。このドキュメントの残りの例では、このエイリアスを設定していることを前提としています。

1sail up

Sailの起動と停止

Laravel Sailのdocker-compose.ymlファイルは、Laravelアプリケーションの構築を支援するために連携して動作する、さまざまなDockerコンテナを定義しています。これらの各コンテナは、docker-compose.ymlファイルのservices設定内のエントリです。laravel.testコンテナは、アプリケーションを提供するプライマリアプリケーションコンテナです。

Sailを開始する前に、ローカルコンピュータで他のWebサーバやデータベースが実行されていないことを確認してください。アプリケーションのdocker-compose.ymlファイルで定義されているすべてのDockerコンテナを起動するには、upコマンドを実行する必要があります。

1sail up

すべてのDockerコンテナをバックグラウンドで起動するには、「デタッチ」モードでSailを起動します。

1sail up -d

アプリケーションのコンテナが起動したら、Webブラウザでプロジェクトにhttps://でアクセスできます。

すべてのコンテナを停止するには、Control + Cを押してコンテナの実行を停止します。または、コンテナがバックグラウンドで実行されている場合は、stopコマンドを使用します。

1sail stop

コマンドの実行

Laravel Sailを使用する場合、アプリケーションはDockerコンテナ内で実行され、ローカルコンピュータから分離されています。ただし、Sailは、任意のPHPコマンド、Artisanコマンド、Composerコマンド、Node/NPMコマンドなど、アプリケーションに対してさまざまなコマンドを実行する便利な方法を提供します。

Laravelのドキュメントを読むと、Sailを参照していないComposer、Artisan、Node/NPMコマンドへの参照をよく目にします。それらの例は、これらのツールがローカルコンピュータにインストールされていることを前提としています。ローカルのLaravel開発環境にSailを使用している場合は、Sailを使用してこれらのコマンドを実行する必要があります。

1# Running Artisan commands locally...
2php artisan queue:work
3 
4# Running Artisan commands within Laravel Sail...
5sail artisan queue:work

PHPコマンドの実行

PHPコマンドはphpコマンドを使用して実行できます。もちろん、これらのコマンドはアプリケーション用に設定されているPHPバージョンを使用して実行されます。Laravel Sailで利用可能なPHPバージョンについて詳しくは、PHPバージョンのドキュメントを参照してください。

1sail php --version
2 
3sail php script.php

Composerコマンドの実行

Composerコマンドはcomposerコマンドを使用して実行できます。Laravel SailのアプリケーションコンテナにはComposerのインストールが含まれています。

1sail composer require laravel/sanctum

既存アプリケーションへのComposer依存パッケージのインストール

チームでアプリケーションを開発している場合、最初にLaravelアプリケーションを作成したのはあなたではないかもしれません。したがって、アプリケーションのリポジトリをローカルコンピュータにクローンした後、Sailを含むアプリケーションのComposer依存パッケージはインストールされていません。

アプリケーションの依存関係をインストールするには、アプリケーションのディレクトリに移動し、次のコマンドを実行します。このコマンドは、PHPとComposerを含む小さなDockerコンテナを使用して、アプリケーションの依存関係をインストールします。

1docker run --rm \
2 -u "$(id -u):$(id -g)" \
3 -v "$(pwd):/var/www/html" \
4 -w /var/www/html \
5 laravelsail/php84-composer:latest \
6 composer install --ignore-platform-reqs

laravelsail/phpXX-composerイメージを使用する場合は、アプリケーションで使用する予定のPHPの同じバージョン(80818283、または84)を使用する必要があります。

Artisanコマンドの実行

LaravelのArtisanコマンドは、artisanコマンドを使用して実行できます。

1sail artisan queue:work

Node/NPMコマンドの実行

Nodeコマンドはnodeコマンドを使用して実行でき、NPMコマンドはnpmコマンドを使用して実行できます。

1sail node --version
2 
3sail npm run dev

必要であれば、NPMの代わりにYarnを使用できます。

1sail yarn

データベースとのやり取り

MySQL

お気づきかもしれませんが、アプリケーションのdocker-compose.ymlファイルにはMySQLコンテナのエントリが含まれています。このコンテナはDockerボリュームを使用しているため、データベースに保存されているデータは、コンテナを停止して再起動しても永続化します。

さらに、MySQLコンテナが初回起動時に2つのデータベースが作成されます。最初のデータベースはDB_DATABASE環境変数の値を使用して命名され、ローカル開発用です。2つ目はtestingという名前の専用テストデータベースであり、テストが開発データに干渉しないようにします。

コンテナを起動したら、アプリケーションの.envファイル内のDB_HOST環境変数をmysqlに設定することで、アプリケーション内のMySQLインスタンスに接続できます。

ローカルマシンからアプリケーションのMySQLデータベースに接続するには、TablePlusなどのグラフィカルデータベース管理アプリケーションを使用できます。デフォルトでは、MySQLデータベースはlocalhostのポート3306でアクセス可能で、アクセス資格情報はDB_USERNAMEおよびDB_PASSWORD環境変数の値に対応します。または、rootユーザーとして接続することもでき、これもパスワードとしてDB_PASSWORD環境変数の値を利用します。

MongoDB

Sailのインストール時にMongoDBサービスをインストールすることを選択した場合、アプリケーションのdocker-compose.ymlファイルにはMongoDB Atlas Localコンテナのエントリが含まれます。これは検索インデックスなどのAtlas機能を備えたMongoDBドキュメントデータベースを提供します。このコンテナはDockerボリュームを使用するため、データベースに保存されたデータはコンテナを停止して再起動しても永続化されます。

コンテナを起動したら、アプリケーションの.envファイル内のMONGODB_URI環境変数をmongodb://mongodb:27017に設定することで、アプリケーション内のMongoDBインスタンスに接続できます。デフォルトでは認証は無効ですが、mongodbコンテナを起動する前にMONGODB_USERNAMEMONGODB_PASSWORD環境変数を設定して認証を有効にすることができます。その後、接続文字列に認証情報を追加します。

1MONGODB_USERNAME=user
2MONGODB_PASSWORD=laravel
3MONGODB_URI=mongodb://${MONGODB_USERNAME}:${MONGODB_PASSWORD}@mongodb:27017

アプリケーションとMongoDBをシームレスに統合するには、MongoDBがメンテナンスしている公式パッケージをインストールできます。

ローカルマシンからアプリケーションのMongoDBデータベースに接続するには、Compassなどのグラフィカルインターフェイスを使用できます。デフォルトでは、MongoDBデータベースはlocalhostのポート27017でアクセスできます。

Redis

アプリケーションのdocker-compose.ymlファイルには、Redisコンテナのエントリも含まれています。このコンテナはDockerボリュームを使用しているため、Redisインスタンスに保存されているデータは、コンテナを停止して再起動しても永続化します。コンテナを起動したら、アプリケーションの.envファイル内のREDIS_HOST環境変数をredisに設定することで、アプリケーション内のRedisインスタンスに接続できます。

ローカルマシンからアプリケーションのRedisデータベースに接続するには、TablePlusなどのグラフィカルデータベース管理アプリケーションを使用できます。デフォルトでは、Redisデータベースはlocalhostのポート6379でアクセス可能です。

Valkey

Sailのインストール時にValkeyサービスをインストールすることを選択した場合、アプリケーションのdocker-compose.ymlファイルにはValkeyのエントリが含まれます。このコンテナはDockerボリュームを使用しているため、Valkeyインスタンスに保存されているデータは、コンテナを停止して再起動しても永続化します。アプリケーションの.envファイル内のREDIS_HOST環境変数をvalkeyに設定することで、アプリケーションからこのコンテナに接続できます。

ローカルマシンからアプリケーションのValkeyデータベースに接続するには、TablePlusなどのグラフィカルデータベース管理アプリケーションを使用できます。デフォルトでは、Valkeyデータベースはlocalhostのポート6379でアクセス可能です。

Meilisearch

Sailのインストール時にMeilisearchサービスをインストールすることを選択した場合、アプリケーションのdocker-compose.ymlファイルには、Laravel Scoutと統合されたこの強力な検索エンジンのエントリが含まれます。コンテナを起動したら、MEILISEARCH_HOST環境変数をhttp://meilisearch:7700に設定することで、アプリケーション内のMeilisearchインスタンスに接続できます。

ローカルマシンから、Webブラウザでhttps://:7700にアクセスすることで、MeilisearchのWebベースの管理パネルにアクセスできます。

Typesense

Sailのインストール時にTypesenseサービスをインストールすることを選択した場合、アプリケーションのdocker-compose.ymlファイルには、Laravel Scoutとネイティブに統合された、この超高速のオープンソース検索エンジンのエントリが含まれます。コンテナを起動したら、以下の環境変数を設定することで、アプリケーション内のTypesenseインスタンスに接続できます。

1TYPESENSE_HOST=typesense
2TYPESENSE_PORT=8108
3TYPESENSE_PROTOCOL=http
4TYPESENSE_API_KEY=xyz

ローカルマシンからは、https://:8108経由でTypesenseのAPIにアクセスできます。

ファイルストレージ

本番環境でアプリケーションを実行中にファイルを保存するためにAmazon S3を使用する予定がある場合は、Sailのインストール時にMinIOサービスをインストールすることをお勧めします。MinIOはS3互換のAPIを提供しており、本番のS3環境で「テスト」ストレージバケットを作成することなく、Laravelのs3ファイルストレージドライバを使用してローカルで開発できます。Sailのインストール中にMinIOをインストールすることを選択すると、MinIOの設定セクションがアプリケーションのdocker-compose.ymlファイルに追加されます。

デフォルトでは、アプリケーションのfilesystems設定ファイルには、s3ディスクのディスク設定がすでに含まれています。このディスクを使用してAmazon S3とやり取りするだけでなく、設定を制御する関連の環境変数を変更するだけで、MinIOなどのS3互換のファイルストレージサービスとやり取りするために使用できます。たとえば、MinIOを使用する場合、ファイルシステムの環境変数設定は次のように定義する必要があります。

1FILESYSTEM_DISK=s3
2AWS_ACCESS_KEY_ID=sail
3AWS_SECRET_ACCESS_KEY=password
4AWS_DEFAULT_REGION=us-east-1
5AWS_BUCKET=local
6AWS_ENDPOINT=http://minio:9000
7AWS_USE_PATH_STYLE_ENDPOINT=true

MinIOを使用する際にLaravelのFlysystem統合が適切なURLを生成できるようにするには、AWS_URL環境変数をアプリケーションのローカルURLと一致させ、URLパスにバケット名が含まれるように定義する必要があります。

1AWS_URL=https://:9000/local

MinIOコンソール経由でバケットを作成できます。コンソールはhttps://:8900で利用可能です。MinIOコンソールのデフォルトユーザ名はsail、デフォルトパスワードはpasswordです。

temporaryUrlメソッドによる一時的なストレージURLの生成は、MinIOを使用する場合はサポートされていません。

テストの実行

Laravelは素晴らしいテストサポートを最初から提供しており、Sailのtestコマンドを使用してアプリケーションの機能テストとユニットテストを実行できます。Pest/PHPUnitが受け入れるCLIオプションはすべてtestコマンドにも渡せます。

1sail test
2 
3sail test --group orders

Sailのtestコマンドは、test Artisanコマンドを実行するのと同じです。

1sail artisan test

デフォルトでSailは、テストがデータベースの現在の状態に干渉しないように、専用のtestingデータベースを作成します。デフォルトのLaravelインストールでは、Sailはテスト実行時にこのデータベースを使用するようにphpunit.xmlファイルも設定します。

1<env name="DB_DATABASE" value="testing"/>

Laravel Dusk

Laravel Duskは、表現力豊かで使いやすいブラウザの自動化およびテストAPIを提供します。Sailのおかげで、ローカルコンピュータにSeleniumやその他のツールをインストールすることなく、これらのテストを実行できます。開始するには、アプリケーションのdocker-compose.ymlファイルでSeleniumサービスのコメントを解除してください。

1selenium:
2 image: 'selenium/standalone-chrome'
3 extra_hosts:
4 - 'host.docker.internal:host-gateway'
5 volumes:
6 - '/dev/shm:/dev/shm'
7 networks:
8 - sail

次に、アプリケーションのdocker-compose.ymlファイル内のlaravel.testサービスのdepends_onエントリにseleniumがあることを確認してください。

1depends_on:
2 - mysql
3 - redis
4 - selenium

最後に、Sailを起動してduskコマンドを実行することで、Duskテストスイートを実行できます。

1sail dusk

Apple SiliconでのSelenium

ローカルマシンにApple Siliconチップが搭載されている場合、seleniumサービスはselenium/standalone-chromiumイメージを使用する必要があります。

1selenium:
2 image: 'selenium/standalone-chromium'
3 extra_hosts:
4 - 'host.docker.internal:host-gateway'
5 volumes:
6 - '/dev/shm:/dev/shm'
7 networks:
8 - sail

メールのプレビュー

Laravel Sailのデフォルトのdocker-compose.ymlファイルには、Mailpitのサービスエントリが含まれています。Mailpitは、ローカル開発中にアプリケーションから送信されるメールを傍受し、ブラウザでメールメッセージをプレビューできる便利なWebインターフェイスを提供します。Sailを使用する場合、Mailpitのデフォルトホストはmailpitで、ポート1025を介して利用できます。

1MAIL_HOST=mailpit
2MAIL_PORT=1025
3MAIL_ENCRYPTION=null

Sailが実行中の場合、MailpitのWebインターフェイスにhttps://:8025でアクセスできます。

コンテナCLI

アプリケーションのコンテナ内でBashセッションを開始したい場合があります。shellコマンドを使用してアプリケーションのコンテナに接続し、ファイルやインストールされているサービスを検査したり、コンテナ内で任意のシェルコマンドを実行したりできます。

1sail shell
2 
3sail root-shell

新しいLaravel Tinkerセッションを開始するには、tinkerコマンドを実行します。

1sail tinker

PHPバージョン

Sailは現在、PHP 8.4、8.3、8.2、8.1、またはPHP 8.0を介したアプリケーションの提供をサポートしています。Sailが使用するデフォルトのPHPバージョンは現在PHP 8.4です。アプリケーションの提供に使用されるPHPバージョンを変更するには、アプリケーションのdocker-compose.ymlファイルのlaravel.testコンテナのbuild定義を更新する必要があります。

1# PHP 8.4
2context: ./vendor/laravel/sail/runtimes/8.4
3 
4# PHP 8.3
5context: ./vendor/laravel/sail/runtimes/8.3
6 
7# PHP 8.2
8context: ./vendor/laravel/sail/runtimes/8.2
9 
10# PHP 8.1
11context: ./vendor/laravel/sail/runtimes/8.1
12 
13# PHP 8.0
14context: ./vendor/laravel/sail/runtimes/8.0

さらに、アプリケーションで使用されているPHPのバージョンを反映するようにimage名を更新することもできます。このオプションもアプリケーションのdocker-compose.ymlファイルで定義されています。

1image: sail-8.2/app

アプリケーションのdocker-compose.ymlファイルを更新したら、コンテナイメージを再構築する必要があります。

1sail build --no-cache
2 
3sail up

Nodeバージョン

SailはデフォルトでNode 20をインストールします。イメージを構築する際にインストールされるNodeのバージョンを変更するには、アプリケーションのdocker-compose.ymlファイルにあるlaravel.testサービスのbuild.args定義を更新します。

1build:
2 args:
3 WWWGROUP: '${WWWGROUP}'
4 NODE_VERSION: '18'

アプリケーションのdocker-compose.ymlファイルを更新したら、コンテナイメージを再構築する必要があります。

1sail build --no-cache
2 
3sail up

サイトの共有

同僚にサイトをプレビューしてもらったり、アプリケーションとのWebhook統合をテストしたりするために、サイトを公開する必要がある場合があります。サイトを共有するには、shareコマンドを使用します。このコマンドを実行すると、アプリケーションにアクセスするために使用できるランダムなlaravel-sail.site URLが発行されます。

1sail share

shareコマンドを介してサイトを共有する場合、アプリケーションのbootstrap/app.phpファイルにあるtrustProxiesミドルウェアメソッドを使用して、アプリケーションの信頼できるプロキシを設定する必要があります。そうしないと、urlrouteなどのURL生成ヘルパが、URL生成中に使用すべき正しいHTTPホストを判断できなくなります。

1->withMiddleware(function (Middleware $middleware) {
2 $middleware->trustProxies(at: '*');
3})

共有サイトのサブドメインを選択したい場合は、shareコマンドを実行するときにsubdomainオプションを指定できます。

1sail share --subdomain=my-sail-site

shareコマンドは、BeyondCodeによるオープンソースのトンネリングサービスであるExposeを利用しています。

Xdebugによるデバッグ

Laravel SailのDocker設定には、PHP用の人気で強力なデバッガであるXdebugのサポートが含まれています。Xdebugを有効にするには、まずSail設定を公開してください。次に、アプリケーションの.envファイルに以下の変数を追加してXdebugを設定します。

1SAIL_XDEBUG_MODE=develop,debug,coverage

次に、公開したphp.iniファイルに以下の設定が含まれていることを確認し、指定されたモードでXdebugが有効になるようにします。

1[xdebug]
2xdebug.mode=${XDEBUG_MODE}

php.iniファイルを変更した後は、php.iniファイルへの変更が反映されるように、Dockerイメージを再構築することを忘れないでください。

1sail build --no-cache

LinuxホストIP設定

内部的に、XDEBUG_CONFIG環境変数はclient_host=host.docker.internalとして定義されているため、XdebugはMacとWindows(WSL2)で適切に設定されます。ローカルマシンがLinuxを実行していて、Docker 20.10以降を使用している場合、host.docker.internalが利用可能であり、手動での設定は不要です。

Docker 20.10より古いバージョンでは、Linuxでhost.docker.internalはサポートされておらず、ホストIPを手動で定義する必要があります。これを行うには、docker-compose.ymlファイルにカスタムネットワークを定義して、コンテナに静的IPを設定します。

1networks:
2 custom_network:
3 ipam:
4 config:
5 - subnet: 172.20.0.0/16
6 
7services:
8 laravel.test:
9 networks:
10 custom_network:
11 ipv4_address: 172.20.0.2

静的IPを設定したら、アプリケーションの.envファイル内でSAIL_XDEBUG_CONFIG変数を定義します。

1SAIL_XDEBUG_CONFIG="client_host=172.20.0.2"

Xdebug CLIの使用法

Artisanコマンドを実行する際にデバッグセッションを開始するために、sail debugコマンドを使用できます。

1# Run an Artisan command without Xdebug...
2sail artisan migrate
3 
4# Run an Artisan command with Xdebug...
5sail debug migrate

Xdebugブラウザの使用法

Webブラウザを介してアプリケーションを操作しながらデバッグするには、WebブラウザからXdebugセッションを開始するためのXdebugが提供する指示に従ってください。

PhpStormを使用している場合は、JetBrainsのゼロコンフィギュレーションデバッグに関するドキュメントを確認してください。

Laravel Sailは、アプリケーションを提供するためにartisan serveに依存しています。artisan serveコマンドは、Laravelバージョン8.53.0以降でのみXDEBUG_CONFIGおよびXDEBUG_MODE変数を受け入れます。古いバージョンのLaravel(8.52.0以前)はこれらの変数をサポートしておらず、デバッグ接続を受け入れません。

カスタマイズ

Sailは単なるDockerなので、ほぼすべてを自由にカスタマイズできます。Sail自身のDockerfileを公開するには、sail:publishコマンドを実行します。

1sail artisan sail:publish

このコマンドを実行すると、Laravel Sailが使用するDockerfileやその他の設定ファイルが、アプリケーションのルートディレクトリ内のdockerディレクトリに配置されます。Sailのインストールをカスタマイズした後、アプリケーションのdocker-compose.ymlファイルでアプリケーションコンテナのイメージ名を変更することもできます。そうした後は、buildコマンドを使用してアプリケーションのコンテナを再構築します。1台のマシンで複数のLaravelアプリケーションを開発するためにSailを使用している場合は、アプリケーションイメージに一意の名前を付けることが特に重要です。

1sail build --no-cache

Laravelは最も生産的な方法です
ソフトウェアを構築、デプロイ、監視します。