Laravel Sailを使った環境構築と「Ports are not available」のエラー対処
Laravel Sailを使った環境構築の方法と発生したエラーの対処について記述します。
(記載内容はWindows環境です。)
Laravel Sailとは
Laravel Sailは、Dockerを使った開発環境です。
Laravel Sailの場合、MySQLやMailHog、Redisといったツールが各コンテナの中に入っています。
(※Laravel Sailのインストールをするには、Dockerのインストールが必要。)
(※さらにWindowsの場合、Dockerをインストールする前にWSLのインストールが必要。)
Laravel Sailを使うメリットとして以下があります。
- 開発に最低限必要なツールを一度にインストールでき、手間が減る。
- 本番環境と同じ環境を用意して動作確認ができる。
- PHPのバージョンが異なる複数のプロジェクトの管理を楽にできる。
Laravel sailを使った環境構築
1. プロジェクトの新規作成
次のコマンドで、Laravelプロジェクトを新規作成します。
コマンド入力後、少し待つとパスワードを要求されるので入力します。
curl -s https://laravel.build/{作成するプロジェクト名} | bash
- curl:主にシェルやスクリプトで使われる。コマンドラインからHTTP(S)リクエストを送信して、WebサーバーやAPIとの通信を行い、データの取得や送信が可能。
- -s オプション:silent を意味し、curl コマンドの出力を静かにするオプション。
- 進行状況(プログレスバー)やエラーメッセージの非表示。
curl [オプション] [URL]
- |:パイプ(|)は、左側のコマンドの出力を右側のコマンドの入力として渡す。
- bash:受け取ったスクリプトを実行するために使用。
以下のようにメッセージが表示されたら、プロジェクトの作成は成功です。
Thank you! We hope you build something incredible. Dive in with: cd {作成したプロジェクト名} && ./vendor/bin/sail up
2. Laravel Sailを起動
以下を実行して、カレントディレクトリを変更します。
cd {作成したプロジェクト名}
続いて以下を実行し、Laravel Sailを起動します。
./vendor/bin/sail up -d
Laravel Sailの起動に成功したら、Webアプリケーションが動いているはずです。
Webブラウザを開いて「https://localhost」へアクセスして確認します。
Laravelのトップ画面が表示されていれば環境構築は完了です。
環境構築にあたって発生したエラー
Laravel Sailを使った環境構築は上記の流れでできますが、いくつかエラーに遭遇したためその内容についてまとめます。
1. Laravel Sailの起動時に「esponse from daemon: Ports are not available:」のエラー
カレントディレクトリを変更し、「./vendor/bin/sail up -d」のコマンドでLaravel Sailの起動を試みると下記のエラーが発生しました。
Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
エラーの内容を見ると、ポート 3306 が他のプロセスですでに使用されていることが原因のようです。
通常、3306 ポートはMySQLやMariaDBが使用するポートであるため、これらが 3306 ポートをすでに占有している可能性があります。
Ⅰ. ポート 3306 を使用しているプロセスを確認する
コマンドプロンプトで以下を実行して、ポート 3306 を使用しているプロセスを確認します。
netstat -ano | findstr :3306
このコマンドの出力により、ポート 3306 を使用しているプロセスID(PID)が確認できます。
TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING 5348
TCP 0.0.0.0:33060 0.0.0.0:0 LISTENING 5348
TCP [::]:3306 [::]:0 LISTENING 5348
TCP [::]:33060 [::]:0 LISTENING 5348
次に、確認できたプロセスIDに対応するアプリケーションを特定します。
プロセスID(PID)を入れてコマンドを実行します。
tasklist /FI "PID eq 5348"
これで、ポート 3306 を占有しているプロセスが分かりました。
イメージ名 PID セッション名 セッション# メモリ使用量
========================= ======== ================ =========== ============
mysqld.exe 5348 Services 0 3,856 K
Ⅱ. ポートを使用しているプロセスを停止する
MySQLがポートを占有していたため、MySQLを停止させます。
以下のコマンドを使って、ポート 3306 を使用しているプロセス(MySQL)を停止させることができるはずです。
net stop mysql
しかしプロセスを停止することはできず、以下の内容が表示されました。
> net stop mysql
無効なサービス名です。
NET HELPMSG 2185 と入力すると、より詳しい説明が得られます。
次に以下のコマンドで、MySQLの強制終了も試しました。
taskkill /PID 5348 /F
すると強制終了に対してもエラーが発生します。
> taskkill /PID 5348 /F
エラー: PID 5348 のプロセスを強制終了できませんでした。
理由: アクセスが拒否されました。
調べてみると、taskkill で「アクセスが拒否されました」と表示されるのは、MySQLのプロセスが管理者権限で実行されていることが理由のようです。
コマンドプロンプトを管理者権限で起動し、taskkill を再実行することでプロセスを停止させることができました。
Ⅲ. 再度、Laravel Sailを起動する
プロセスを停止した後、「./vendor/bin/sail up」コマンドを実行します。
これで、Laravel Sailがポート 3306 を使用できるようになり、正常に起動できました。
Webブラウザを開いて「https://localhost」へアクセスし、Laravelのトップ画面が表示されていれば環境構築は完了になります。
2.Laravelのトップ画面にアクセスを試みると「Internal Server Error」のエラー
「/vendor/bin/sail up」コマンドを実行後、ブラウザで「http://localhost」にアクセスすると、トップ画面ではなくエラー画面に遷移しました。
ブラウザの表示内容は以下です。
Internal Server Error
Illuminate\Database\QueryException
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel.sessions' doesn't exist (Connection: mysql, SQL: select * from sessions where id = hL1v0gFLigFY8qjqMo2GKFIFdMdubXlr1HMXoLyP limit 1)
エラーメッセージによると、Laravelが sessions テーブルをデータベース内で見つけられないため、Internal Server Error が発生しているようです。
sessions テーブルは通常、Laravelがセッション情報を保存するために使用します。
エラーを解決するために、マイグレーションを実行してみます。
Ⅰ. マイグレーションを実行する
Laravelでは、データベースのテーブルはマイグレーション(migration)を通じて作成されます。sessions テーブルは、php artisan session:table コマンドでマイグレーションファイルを生成し、その後マイグレーションを実行することで作成できます。
まず、Laravel Sailを起動します。
バックグラウンドで起動したい場合は、-d オプションをつけてください。
./vendor/bin/sail up -d
次に、Laravel Sailのコンテナに接続します。
./vendor/bin/sail shell
続いてコンテナ内に入ったら、必要なマイグレーションを実行します。
php artisan migrate
これにより、sessions テーブルがデータベースに作成されます。
Ⅱ. ブラウザからエラーの解消を確認する
マイグレーションが成功し、再度ブラウザで「http://localhost」にアクセスしすると、エラーが解消し、Laravelのトップ画面が表示されました。
最後に
Laravel Sailを使った環境構築は他の方法と比べると手軽で、初学者でも簡単に環境構築ができます。
しかし場合によっては今回のようにエラーが発生することもあり、簡単なDockerの知識を事前に入れておくことで、エラーにも対処しやすくなるかと思います。
Discussion