Laravel 10のDocker環境作成 (PHP8.1, apache, MariaDB, Xdebug)
目的
docker環境の生成は、過去に作った環境をコピーすれば躓くことはほぼないが、初めて作る場合は、予期しないエラーに躓き、非常に時間を食うことが多い。
今回は、以前紹介した基本テンプレートをベースに、手軽にLaravelのDocker環境を作成する手順を紹介します。
今回は、2023年2月14日 リリースされたばかりのLaravel10 (サーバー要件: PHP 8.1以上)を使います。
バージョン情報
- Laravel 10.0.0
- 手元の作業PC: Apple M1 Pro
- Docker: 20.10.21
- イメージ: php:8.1-apache
- イメージ: mariadb:10.3
- イメージ: phpmyadmin:latest
- イメージ: mailhog/mailhog:latest
- PHP: 8.1
- DB: mariadb 10.3
- Docker-compose: 2.13.0
ゴール
http://localhost でデフォルトのトップページ(welcome.blade.php)の内容が表示されること
ディレクトリ構成
プロジェクトルート
├── .vscode
│ └── launch.json (vscode エディタのデバッガー設定)
├── www
│ └── [laravel関連のもの]
├── docker-compose.yml
└── docker
├── app
│ ├── apache2
│ │ ├── sites-available
│ │ │ └── 000-default.conf
│ │ └ apache2.conf
│ ├── php.ini
│ └── Dockerfile
├── msmtp
│ └── msmtprc (メール送信のSMTP設定用)
└── mysql
├── initdb (sqlの初期化用)
├── storage (データのマウント用)
├── Dockerfile
└── server.cnf
手順
wwwディレクトリの中身以外は前に紹介した基本テンプレートと全く同じ。
しかし、ReactやVueを組み込む場合はViteで使うポート(5173)のフォワード設定が必要。
一行追加しておきましょう。5173:5173
version: "3"
services:
app:
build:
context: "docker/app/"
ports:
- 80:80
- 8000:80
- 5173:5173 # viteで使用するポートをフォワード
working_dir: /var/www
volumes:
- "./www/:/var/www"
- "./docker/app/apache2/apache2.conf:/etc/apache2/apache2.conf"
- "./docker/app/apache2/sites-available/000-default.conf:/etc/apache2/sites-available/000-default.conf"
- "./docker/msmtp/msmtprc:/etc/msmtprc"
depends_on:
- mysql
- mailhog
mysql:
build:
context: "docker/mysql/"
command: --default-authentication-plugin=mysql_native_password
environment:
- MYSQL_DATABASE=test_db_name
- MYSQL_HOST=mysql
- MYSQL_USER=test_user
- MYSQL_PASSWORD=test_pass
- MYSQL_ROOT_PASSWORD=test_root_pass
- TZ=Asia/Tokyo
volumes:
- "./docker/mysql/storage/:/var/lib/mysql"
- "./docker/mysql/initdb/:/docker-entrypoint-initdb.d"
ports:
- "3306:3306"
phpmyadmin:
image: phpmyadmin:latest
ports:
- 8080:80
environment:
- PMA_HOST=mysql
- PMA_USER=test_user
- PMA_PASSWORD=test_pass
depends_on:
- mysql
mailhog:
image: mailhog/mailhog:latest
ports:
- "8025:8025"
- "1025:1025"
volumes:
storage:
laravelをwww配下にインストール
$ docker-compose build
$ docker-compose run --rm app composer create-project laravel/laravel:^10.0 .
www配下に、以下のようなファイルやディレクトリがインストールされると思います。
www
├── README.md
├── app
├── artisan
├── bootstrap
├── composer.json
├── composer.lock
├── config
├── database
├── package.json
├── phpunit.xml
├── public
├── resources
├── routes
├── storage
├── tests
├── vendor
└── vite.config.js
.envを更新
DBとSMTPの接続情報の環境変数を更新する
...
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=test_db_name
DB_USERNAME=test_user
DB_PASSWORD=test_pass
...
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"
...
タイムゾーンとロケールを日本に変更
...
'timezone' => 'Asia/Tokyo',
...
'locale' => 'ja',
...
ドキュメントルートをデフォルト(public)からhtmlに変更
$ mv www/public www/html
public_path()を上書き
組み込みのpublic_path関数は、デフォルトでは/var/www/public
を返す
> echo public_path();
/var/www/public
しかし、リネームしたドキュメントルートの/var/www/html
を返して欲しいので、www/bootstrap/app.phpに追記する
...
/*
|--------------------------------------------------------------------------
| Bind Important Interfaces
|--------------------------------------------------------------------------
|
| Next, we need to bind some important interfaces into the container so
| we will be able to resolve them when needed. The kernels serve the
| incoming requests to this application from both the web and CLI.
|
*/
...
// public_path()の設定 "/var/www/public"(デフォルト) => "/var/www/html"
$app->usePublicPath(base_path('html'));
これで、public_path()の返り値が更新される
> echo public_path();
= "/var/www/html"
コンテナ起動
$ docker-compose up -d
その他初期セットアップ
$ docker compose exec app bash
# php artisan key:generate
# php artisan storage:link
(# ln -sf /var/www/storage/app/public /var/www/html/storage でもOK)
# chmod -R 777 storage bootstrap/cache
WEBページを確認
http://localhost でデフォルトのトップページ(welcome.blade.php)の表示を確認
確認1:確認2: phpmyadminにアクセス、ログインできることを確認
確認3: メール送信テストと確認
メール送信テスト
appコンテナにアクセスした後、mail送信のスクリプトを実行する
$ docker-compose exec app bash
root@f761b2f53458:/var/www# php -r "mail('test@example.com', 'テストタイトル', 'テスト本文', 'From: from@example.com');";
メール確認
http://localhost:8025/ にアクセス
確認4: デバッガーの確認 (VSCodeをエディタで使っている人のみ)
例として、www/app/Providers/RouteServiceProvider.php でブレークポイントを設定してページをリロードしてみます。すると、ブレークポイントで停止することが確認できました。
終わりに
今回は、前回紹介したLAMP環境テンプレートを使った超楽チン LaravelのDocker環境構築手順を紹介いたしました。LAMP環境テンプレートは、Wordpressやその他のフレームワークなど、何にでも応用できるので、ガンガン再利用しましょう。
Discussion