Laravel Sailとは|sail up・sail downなど基本コマンドの使い方と導入手順
Laravel Sailは、PHP・MySQL・Redisを含むLaravel公式のDocker開発環境を、Dockerの知識がなくても扱えるようにするコマンドラインツールです。実体はプロジェクト直下のcompose.yamlとsailスクリプトだけで、複雑なdocker-compose定義を自分で書く必要がありません。検索で多いのは「sail up」「sail down」の意味と使い分けです。まず結論から示し、続いて導入手順・コマンド一覧・カスタマイズ・Podman対応・起動トラブルの対処までを、公式ドキュメント(Laravel 13.x)に沿って整理します。
まとめ:Laravel Sailの要点
- Sailの正体:
compose.yaml+sailスクリプトの2つ。デフォルトはPHP・MySQL・Redisの3サービス構成。 - 起動と停止の使い分け:
sail up=起動、sail up -d=バックグラウンド起動、sail stop=コンテナを残したまま停止、sail down=コンテナとネットワークを削除して停止(データはボリュームに残る)。 - 導入:新規Laravelは同梱済み。既存アプリは
composer require laravel/sail --dev→php artisan sail:install。 - コマンドはsail経由で:
php artisanやcomposer、npmはコンテナ内で動かすためsail artisanのようにsailを前置する。 - Podman:公式SailはDocker前提。Podman利用はコミュニティ製フォークが必要で公式サポート外。
Laravel Sailとは|公式のDocker開発環境
Laravel Sailは、Laravelアプリをローカルで動かすためのDockerコンテナ群を、簡単なCLIで操作できるようにするツールです。XAMPPやローカルへの直接インストールと違い、PHP・データベース・キャッシュを含む環境一式をコンテナとして立ち上げるため、チームで環境差異が出にくく、「自分の端末では動くのに」を減らせます。デフォルトのサービスはPHP・MySQL・Redisで、必要に応じてMongoDBやMeilisearchなどを後から追加できます。
compose.yamlとsailスクリプトの役割
Sailの中身はプロジェクト直下の2ファイルだけです。compose.yamlが起動するコンテナ(services)を定義し、sailスクリプトがそれらを操作するCLIを提供します。アプリ本体を動かすのはlaravel.testという名前のコンテナです。以前のバージョンで使われていたdocker-compose.ymlという名前は、現在はcompose.yamlに統一されているため、古い記事のファイル名とは異なる点に注意してください。
対応OS(macOS・Linux・Windows WSL2)
SailはmacOS・Linux・Windowsで動作します。WindowsではWSL2上での利用が前提で、Docker DesktopのWSL2連携を有効にした上で、WSL2のLinux側にプロジェクトを置いて操作します。Docker Desktop for Linuxを使う場合はdocker context use defaultでdefaultコンテキストに切り替えます。加えて、コンテナ内でファイル権限エラーが出る場合は、環境変数SUPERVISOR_PHP_USERをrootに設定します。
Laravel Sailの導入手順
導入経路は「新規Laravelプロジェクト」と「既存アプリへの追加」の2通りです。新規なら追加作業はほぼ不要で、既存アプリはComposer経由でSailを入れてから設定を発行します。
新規プロジェクトでの利用
Laravelの新規プロジェクトにはSailが最初から同梱されています。プロジェクトのルートで次を実行すれば、compose.yamlに定義されたコンテナがすべて起動し、http://localhostでアプリにアクセスできます。
./vendor/bin/sail up
既存アプリへのSail追加(composer require・sail:install)
すでにあるLaravelアプリにSailを後から追加する場合は、開発依存としてSailを入れ、sail:installでcompose.yamlと.envを発行します。sail:installは使いたいサービスを対話的に選ばせ、接続用の環境変数を.envに書き込みます。
composer require laravel/sail --dev
php artisan sail:install
後からサービスを増やしたいときはphp artisan sail:addを使います。「docker nginx php mysql laravel」のような自前のDocker構成を組む代わりに、Sailなら必要なサービスをコマンドで足せるのが利点です。
sailエイリアスの設定
毎回vendor/bin/sailと打つのは冗長なので、シェルにエイリアスを設定してsail upのように短く呼べるようにします。次の行を~/.zshrcや~/.bashrcに追記してシェルを再起動してください。以降はどのコマンドもsailだけで実行できます。
alias sail='sh $([ -f sail ] && echo sail || echo vendor/bin/sail)'
sail up・sail down・sail stopの意味と使い分け
検索で最も多いのが、起動・停止系コマンドの「意味」と使い分けです。混同しやすいのはstopとdownで、コンテナを残すか削除するかが違います。
- sail up:
compose.yamlのコンテナをすべて起動する。ログがターミナルに出続け、Control+Cで停止できる。 - sail up -d:バックグラウンド(デタッチモード)で起動する。ターミナルを占有せず作業を続けられるため、実務ではこちらを使うことが多い。
- sail stop:起動中のコンテナを停止するが、コンテナ自体は削除しない。次回は
sail upで素早く再開できる。 - sail down:Sailはdocker composeへコマンドを委譲するため、
sail downはコンテナとネットワークを停止・削除する。データベースの中身はDockerボリュームに残るので消えない。環境を作り直したいときに使う。 - sail restart:起動中コンテナの再起動。設定変更を軽く反映したいときに使う。
「sail upが動かない」「起動が遅い」ときは、いったんsail downしてからsail build --no-cacheでイメージを作り直し、再度sail upすると解決することが多いです。よく使うコマンドを一覧にまとめます。
| コマンド | 動作 | コンテナの扱い |
|---|---|---|
| sail up | 全コンテナを起動(フォアグラウンド) | 作成・起動 |
| sail up -d | 全コンテナをバックグラウンド起動 | 作成・起動 |
| sail stop | コンテナを停止 | 残す |
| sail down | 停止してコンテナ・ネットワークを削除 | 削除(ボリュームは保持) |
| sail restart | コンテナを再起動 | 維持 |
| sail build –no-cache | イメージを再構築 | 再ビルド |
sail経由でのartisan・composer・npm実行
アプリはコンテナ内で動くため、php artisanやcomposer、npmをローカルに直接打つとコンテナ内の環境とずれます。Sailを使う間は、これらのコマンドの前にsailを付けてコンテナ内で実行します。公式ドキュメントの「php artisan queue:work」といった例は、Sail環境ではsail artisan queue:workに読み替えます。
sail php --version
sail composer require laravel/sanctum
sail artisan migrate
sail npm run dev
コンテナ内でシェルを開いてファイルを確認したいときはsail shell(root権限が必要ならsail root-shell)、対話実行ならsail tinkerを使います。テストはsail test(sail artisan testと等価)で実行でき、専用のtestingデータベースが自動で使われるため開発用データを汚しません。ブラウザテストのLaravel Duskによるテスト自動化もSeleniumのローカル導入なしにコンテナ内で動かせます。
データベースとサービスの追加(MySQL・Redis・MongoDB)
デフォルトのMySQLは、初回起動時に開発用(DB_DATABASEの値)とテスト用(testing)の2つのデータベースを自動作成します。アプリからは.envのDB_HOSTをmysqlにして接続します。ローカルのGUIツール(TablePlus等)からはlocalhostのポート3306で接続でき、認証情報はDB_USERNAME/DB_PASSWORDに対応します。Redisはホスト名redis・ポート6379で利用します。
MongoDBやValkey、Meilisearch、Typesenseを使いたい場合は、導入時に選ぶかphp artisan sail:addで後から追加します。例えばMongoDBを追加すると、.envのMONGODB_URIをmongodb://mongodb:27017に設定して接続します。データベース設計の前提となるLaravelの命名規則もあわせて確認しておくと、テーブル名やモデル名の齟齬を避けられます。
PHPバージョン・Nodeバージョンの変更とカスタマイズ
Sailが標準で使うPHPは8.5で、8.5・8.4・8.3・8.2・8.1・8.0を選べます。バージョンを変えるにはcompose.yamlのlaravel.testのbuildで参照するランタイムのパス(例:./vendor/laravel/sail/runtimes/8.4)を書き換え、あわせてimage名(例:sail-8.4/app)も対応するバージョンに変更します。Nodeは標準でNode 24が入り、build.argsのNODE_VERSIONで変更できます。いずれも変更後はsail build --no-cacheでイメージを作り直します。
sail build --no-cache
sail up
Dockerfile自体をカスタマイズしたいときはsail artisan sail:publishで設定ファイルをdockerディレクトリに書き出せます。1台で複数のLaravelアプリをSailで開発する場合は、アプリごとにimage名を一意にしておくとイメージの取り違えを防げます。
Podman対応の可否とコミュニティフォーク
「laravel sail podman」で調べる人がいますが、結論として公式のLaravel SailはDocker(およびDocker Compose)を前提に作られており、Podmanは公式サポート外です。PodmanでSailを動かしたい場合は、sailスクリプトがDockerではなくPodmanを呼ぶよう手を入れたコミュニティ製フォーク(sail-podman)を使う形になります。ただしフォークは公式より保守体制が小さく、公式の更新(PHPバージョンの追加やサービス構成の変更)への追従が遅れる可能性があります。会社やチームの標準環境として長期運用するなら、素直にDocker(またはDocker Desktopのライセンス条件を満たす代替)を使うほうが、公式ドキュメントとの整合が取れて保守が楽です。Podmanをどうしても使う必要がある特定要件がない限り、公式Dockerでの運用を推奨します。
localhost接続拒否など起動時のトラブルと対処
Sailでよくあるのが、ブラウザでhttp://localhostを開いたときの「このサイトにアクセスできません/ERR_CONNECTION_REFUSED」です。多くは次のいずれかが原因です。
- コンテナが起動していない:
sail up -dを実行したか、sail psでlaravel.testが起動中か確認する。 - ポートの競合:ローカルで別のWebサーバやMySQLが同じポート(80・3306等)を使っている。Sail起動前に他のサーバ・DBを停止する。
.envのAPP_PORTで待ち受けポートを変更することもできる。 - WSL2側にプロジェクトが無い:WindowsでWindows側ディレクトリに置くと権限・パフォーマンス問題が出る。WSL2のLinuxファイルシステム上にプロジェクトを置く。
- ビルドの取りこぼし:
sail down→sail build --no-cache→sail upでイメージを作り直す。
それでも解決しない場合はsail logsでコンテナのログを確認し、どのサービスが起動に失敗しているかを切り分けます。
よくある質問
sail downとは何ですか?
sail downは起動中のコンテナとネットワークを停止して削除するコマンドです。sail stopがコンテナを残したまま止めるのに対し、downはコンテナを消して環境をリセットします。データベースの中身はDockerボリュームに保存されているため、downだけでは消えません。ボリュームごと消したい場合はdocker compose down -vを使います。
sail upとsail up -dの違いは?
どちらもコンテナを起動しますが、sail upはフォアグラウンドで動きログが流れ続けます。sail up -dはバックグラウンド(デタッチモード)で起動し、ターミナルを占有しません。開発中は-d付きが便利です。
Laravel SailでMySQLを使うには?
デフォルト構成にMySQLが含まれているため、追加設定は基本的に不要です。アプリの.envでDB_HOSTをmysql、DB_USERNAME/DB_PASSWORDを設定すれば接続できます。ローカルのGUIツールからはポート3306で接続します。
Laravel Sailは本番環境でも使えますか?
Sailはローカル開発環境向けのツールで、本番運用を想定した構成ではありません。本番でコンテナを動かすなら、AWS ECSなどのコンテナオーケストレーションや専用のデプロイ基盤を使い、Sailは開発時のローカル環境に限定するのが一般的です。
Sailのコマンドを短く打つには?
シェルにエイリアスを設定すれば、vendor/bin/sailを省いてsail upのように打てます。設定するエイリアス行は本文「sailエイリアスの設定」を参照し、~/.zshrc等に追記してシェルを再起動してください。