🕌

私的 Laravel 用 Docker 構成 2022

2022/03/26に公開

最近は Docker で Laravel の開発環境を整えています

この環境のリポジトリはこちら↓

https://github.com/blancpanda/docker-laravel-2022

必要なものはその都度違うので、少し書き換えてからコンテナをビルドすることが多いですね。
Jetstream (inertia) を使う前提なので、Vue を扱えるようにしています。

2022/8/6 追記

Laravel v9.2 からの Vite を使う環境を Laravel Sail で作りました。

https://zenn.dev/blancpanda/articles/my-laravel-sail-vite

全体ディレクトリ構成

.
├── .vscode
│   └── launch.json
├── bin (コマンドショートカット用スクリプト)
│   ├── artisan
│   ├── composer
│   └── npm
├── db-work (dbコンテナの作業用ディレクトリと同期)
├── infra
│   ├── mysql
│   │   ├── Dockerfile
│   │   └── my.cnf
│   ├── nginx
│   │   └── default.conf
│   └── php
│       ├── Dockerfile
│       └── php.ini
├── laravel (Laravelをインストールするディレクトリ)
│   └── js.config.json (Laravel インストール後に作成)
├── docker-compose.yml
├── tables-mdstyle.xsl
└── vetur.config.js

Docker と関係ないファイルがちょいちょい混じってますが、これらがないと主に VSCode で使いづらいので一緒に入れるようにしています。

コンテナの起動/停止

初回

docker compose --profile extra up -d --build
docker compose --profile extra down

2回目以降

docker compose up -d
docker compose down

プロファイル extra について

node コンテナを起動しておくと watch で待機するようになるので、ファイルの変更にあわせて自動でコンパイルが行われます。
普段は任意のタイミングで npm run dev を実行したいので、別プロファイルにして node コンテナのみ起動しないようにしています。

コマンドのショートカット

コマンドが長いので bin配下にショートカットのためのスクリプトを用意してあります(zsh 用)。
実行できるようにパーミッションを変更します。

chmod u+x bin/*

artisan, composer, npm があります。以下のような使い方ができます。

bin/npm run dev

Laravel のインストール

app コンテナに入り、Laravel と Jetstream をインストール

docker compose exec app bash
composer create-project --prefer-dist "laravel/laravel=9.*" .
php artisan storage:link
chmod -R 777 storage bootstrap/cache
composer require laravel/jetstream
php artisan jetstream:install inertia
exit

node コンテナで リソースのコンパイル

bin/npm install
bin/npm run dev

.env を編集してデータベースの接続先を設定

laravel/.env
# :
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=phper
DB_PASSWORD=secret
# :

app コンテナでマイグレーション

bin/artisan migrate

VSCode 用の設定ファイル類

  • XDebug を使ったデバッグ実行のための構成ファイル .vscode/launch.json を用意しています。
  • Vue 用の拡張 Vetur を使う関係で、Laravel の階層が異なるので、 .vetur.config.js で指定しています。
  • Vetur はプロジェクトルートで jsconfig.json か tsconfig.json を探すので、Laravel インストール後に laravel ディレクトリ直下に作成するようにします。
laravel/jsconfig.json
{
    "compilerOptions": {
        "baseUrl": ".",
        "paths": {
            "@/*": ["resources/js/*"]
        }
    },
    "exclude": ["node_modules", "public"]
}

テーブル定義書 (laravel/database/README.md) の生成

db コンテナ内で mysqldump を使って出力したテーブル定義の xml に xslt をあててマークダウンのテーブル定義書を生成できるようにしています。

mysqldumpでテーブル定義のxmlを出力

docker compose exec db sh
mysqldump --no-data --xml -u root -p laravel > ./work/laravel.xml
Enter password: secret
exit

コメントを出力するようにしているので、日本語名や説明を設定しておくとよいです。

xsltをあててマークダウンに変換

xsltproc -o laravel/database/README.md tables-mdstyle.xsl db-work/laravel.xml

Laravel をこの Docker 構成ごと git 管理下においた場合の clone からの再構築

初回起動時は extra プロファイルをつけて up
※ [repository], [project-dir] は各環境に置き換える

git clone [repository]
cd [project-dir]
chmod u+x bin/*
docker compose --profile extra up -d --build
docker compose exec app bash
composer install
cp .env.example .env
php artisan key:generate
php artisan storage:link
chmod -R 777 storage bootstrap/cache
exit
bin/npm install
bin/npm run dev
bin/artisan migrate

初回起動時は extra プロファイルをつけて down

docker compose --profile extra down

Special Thanks:

https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4

↑こちらの構成を参考に、ちょいちょい手を加えています。

Discussion