Laravel Sailとは — Dockerを意識せずにLaravel開発環境を用意する公式ツール

Laravel Sailは、PHPやMySQLをローカルへ直接入れず、Dockerコンテナだけで開発環境を立ち上げるためのLaravel公式コマンドラインツールです。Dockerはアプリの動作環境を丸ごと再現する仮想化技術ですが、Sailがその設定ファイルを自動生成するため、開発者はDockerの細かい記述を書かずに済みます。

要するに、環境構築の定型作業を肩代わりする薄いラッパーだと捉えるとよいでしょう。

Laravel Sailが稼働している開発環境のイメージ

sail:installで生成されるもの(Composeファイル)

php artisan sail:installを実行すると、プロジェクト直下に複数コンテナの構成を書いたcompose.yamlが生成されます(既存のdocker-compose.ymlがあるプロジェクトではそちらが更新されます)。ビルド定義一式をdockerディレクトリへ展開するのは、後述のsail:publishの役割です。--php=8.5のようにバージョンを指定でき、省略時は8.5が使われます。

デフォルトで組み込まれるサービス構成

対話プロンプトでは既定でmysqlだけが選択済みになっています。--no-interaction付きで実行した場合は、mysqlredisseleniummailpitの4つが初期構成に入ります。mailpitは送信メールを実際には送らず画面で確認するツールで、開発中に本番へ誤送信する事故を防げます。ブラウザテストを自動化しない案件なら、seleniumを外す判断もありでしょう。

sail:installからsail upまで — 導入・起動の手順と結果の確認

導入は単純です。sail:installで構成を作り、続けてコンテナを起動します。

php artisan sail:install
./vendor/bin/sail up -d

起動後は./vendor/bin/sail psで各コンテナがUp状態かを確認します。mysqlがすぐ落ちる場合、既存のローカルMySQLが3306番ポートを占有していることが多く、bind: address already in useが出ます。ホスト側を止めるか、公開ポートをずらして解決してください。

インストール直後にartisan migrateが要る理由

DBサービスを含めてインストールすると、Sailは.envを書き換えます。具体的にはDB_HOST127.0.0.1からコンテナ名(mysqlならmysql、mariadbならmariadb)へ、DB_USERNAMErootからsailへ、パスワードをpasswordへ変更します。接続先が新しいコンテナDBを指すため、テーブルは空のまま。起動後に./vendor/bin/sail artisan migrateを走らせないと、テーブル未作成のエラーで詰まります。この案内はインストール時にも警告として表示されます。

sail:addとsail:publishの使い分け

後からサービスを足すときはsail:addを使います。たとえばmemcachedを追加すると、Composeファイルにサービス定義が追記されます(mysqlやredisのようなデータを持つサービスの場合は、あわせてvolume定義も追加されます)。既存構成を壊さず差分だけ入れたい場面に向いています。

一方sail:publishは、vendor配下のDocker定義一式をプロジェクトのdockerディレクトリへ展開し、composeファイル内の参照パスも書き換えます。PHPのDockerfileを直接いじって独自ライブラリを組み込みたいときに使う、より踏み込んだ操作です。ここで展開したファイルは以後Sailのアップデートで自動更新されなくなるため、単にサービスを増やすだけならpublishは避けるのが無難です。

カスタマイズに関するお問い合わせはこちら

    本記事のコード・挙動に関する記述は、Laravel 13.23.0、laravel/sail v1.64.0 の実際のソースコードと照合して確認しています。