Laravelで、かんたんに Docker化できる 「Sail」とは
便利なのですが、まずはSailとはなにかを説明します。
Laravel Sail は、Laravel アプリケーションのための軽量な Docker 開発環境です。Sail を使用すると、Docker コンテナの複雑さを抽象化し、Laravel アプリケーションの開発とテストを容易にします。
- php
- db ( mysqlやmariadbなど)
この2つがセットアップされます。
ここで注意しておきたいのは、webサーバー(nginx とか apacheとか)が存在しません。
実は、PHPにはビルトインウェブサーバーが存在しています。
php.net ビルトインウェブサーバー
PHPのドキュメントにもありますが
「 このウェブサーバーは単一のシングルスレッドプロセスしか実行しないので、 リクエストがブロックされると、PHP アプリケーションはストールします 」
ちなみに、以下のコマンドでいつでもWEBサーバーが動きます。
php run serve
Laravel Sail の基本的なセットアップ手順 (すでにプロジェクトがある場合)
Laravel Sail のセットアップ
- Laravel インストーラのインストール
Laravel インストーラを使って新しいプロジェクトを作成する場合は、まずインストーラをインストールする必要があります。
composer require laravel/sail --dev
これで sailは ./vendorに配置される。
Docker 環境の起動
Sail を使用して Docker コンテナを起動します。
./vendor/bin/sail up -d
アプリケーションのアクセスできることを確認
ブラウザで http://localhost
php artisan sail:install
## 以下のDBなどから選択できます。 複数選ぶときは、カンマ区切りで
Which services would you like to install? [mysql]:
[0] mysql
[1] pgsql
[2] mariadb
[3] redis
[4] memcached
[5] meilisearch
[6] minio
[7] mailhog
[8] selenium
以上でインストールされます。
docker-compose.yml
が作成されます。
で、ここからが本題です。
認証のリクエストしたら、その中で自分自身を呼び出すようなコーディングしていた場合ですね。
このときもう一つプロセスが立ち上がろうとしていますが、PHPのドキュメントにもあるように、ストール(停止)します。
応答なしとなります。
ここが一番時間がかかりました。ストールするとなんにもエラーログもなんにも出ないです。ストールの怖いところです。
$http = new GuzzleHttp\Client;
$response = $http->post('http://docker.host.internal/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => '2',
'client_secret' => 'WJFDwSKZBJHoScIfs7WSj4gSsLtV9LU5fmLRK5p8',
'username' => 'admin@example.com',
'password' => 'password',
'scope' => '',
],
]);
var_dump(json_decode((string) $response->getBody(), true));
なにか回避方法はないのか?と調べてましたが、ありません。
PHPのドキュメントには、「ビルトインウェブサーバーに実験的にマルチプロセス対応を行っている」という記載があるので、近い将来には実装されるかもしれませんね。
結論、これは、sailでは不可能となります。
素直に、php / nginx という環境にしましょう。