🖥️

Laravel Sailを使った環境構築と「Ports are not available」のエラー対処

2025/01/19に公開

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