🐡

Laravel 10のDocker環境作成 (PHP8.1, apache, MariaDB, Xdebug)

2023/02/17に公開

目的

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ディレクトリの中身以外は前に紹介した基本テンプレートと全く同じ。
https://zenn.dev/dragonarrow/articles/b3fbdf1718a812

しかし、ReactやVueを組み込む場合はViteで使うポート(5173)のフォワード設定が必要。
一行追加しておきましょう。5173:5173

docker-compose.yml
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}"
...

タイムゾーンとロケールを日本に変更

www/config/app.php
...
'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に追記する

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ページを確認

確認1: http://localhost でデフォルトのトップページ(welcome.blade.php)の表示を確認

確認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