2024年にWEB業界に復帰してから、dockerを学びWSLを学びTypeScriptとReactに取り組み、Laravelアプリはbitnamiのdockerで開発してたけどなんかbitnamiイマイチじゃね?有料になった感じもあるし、そもそもファイルがbitnamiユーザー(WSLからはrootユーザー)になるしって思って改めてやり直してみる。
概要
色々と調べたらこんな感じみたい。 - docker はLaravel-sailで用意してくれる。 - 認証周りとデフォルトテンプレートを作ってくれるはBreezeが終わってstarter kitsが用意されている。 - docker containerの中身を直接VS Codeが見てくれる dev containerがあると barryvdh/laravel-ide-helper よりいいらしい。そりゃそうだ。
Laravel+Dockerの設定を実行する
環境
WSL2+Ubuntu24で実行している。
Laravelインストーラーのインストール
当初、よくあるsailの導入記事の curl -s "https://laravel.build/my-app?with=mariadb" | bash って感じでLaravelを導入しようとしたら、Starter Kitsが入らない。
どうもStarter Kitsは、Laravel インストーラーのインストール途中で入れるものになったらしい。BreezeだとあとでComposerで入れられたんだけどな…
ということで、Laravelインストーラーのインストールからはじめる。
composer global require laravel/installer
これで、WSLのbashでlaravelコマンドが使えるようになった。
Laravelのインストール
laravel new my-app
これでmy-appディレクトリが作られてその中にLaravelがプレーンな状態で展開されるのだけど、途中でStarter Kitの選択を行う。
$ laravel new sample-app
██╗ █████╗ ██████╗ █████╗ ██╗ ██╗ ███████╗ ██╗
██║ ██╔══██╗ ██╔══██╗ ██╔══██╗ ██║ ██║ ██╔════╝ ██║
██║ ███████║ ██████╔╝ ███████║ ██║ ██║ █████╗ ██║
██║ ██╔══██║ ██╔══██╗ ██╔══██║ ╚██╗ ██╔╝ ██╔══╝ ██║
███████╗ ██║ ██║ ██║ ██║ ██║ ██║ ╚████╔╝ ███████╗ ███████╗
╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═══╝ ╚══════╝ ╚══════╝
┌ Do you want to use a starter kit? ───────────────────────────┐
│ Yes │
└──────────────────────────────────────────────────────────────┘
┌ Which frontend stack should your starter kit use? ───────────┐
│ React │
└──────────────────────────────────────────────────────────────┘
┌ Which authentication provider do you prefer? ────────────────┐
│ Laravel's built-in authentication │
└──────────────────────────────────────────────────────────────┘
┌ Would you like to add teams support to your application? ────┐
│ Yes │
└──────────────────────────────────────────────────────────────┘
認証方法はとりあえず全部チェックしておいて必要なモノだけ後でONにするようにする。
┌ Which authentication features would you like to enable? ─────┐
│ › ◼ Email verification │
│ ◼ Registration │
│ ◼ Two-factor authentication │
│ ◼ Passkeys │
│ ◼ Password confirmation │
└──────────────────────────────────────────────────────────────┘
Use space to select, enter to confirm.
Running database migrations...で×が出るけど、まぁそれは今の所は仕方ない。あとで artisan migrateを実行する。
sailのインストールとセットアップ
docker周りのセットアップや通信をしてくれるsailがあるのでcomposerコマンドでインストール
cd sample-app composer require laravel/sail --dev ./artisan sail:install
この時必要なサービスを選択する。私はmariadbだけを選択したが、redisとかも追加できそれに対応したdockerがセットアップされる。
┌ Which services would you like to install? ───────────────────┐
│ mariadb │
└──────────────────────────────────────────────────────────────┘
これで vendor/bin/sail コマンドが使えるようになる。これはdocker exec みたいなもんだけど、コンテナ名とか省略できて非常に便利。
~/.bashrc に以下を入れておくとsail だけでLaravelプロジェクトのルートから使えるようになる。
alias sail='sh $([ -f sail ] && echo sail || echo vendor/bin/sail)'
相対パスなのがポイント。
で、
vendor/bin/sail up -d vendor/bin/sail down
でdockerの上げ下げになる。
とりあえず、データベースのmigrationを実行しておく。Starter KitのDBテーブルが作成される。
sail artisan migrate
コンテナ名を固定にしたい
コンテナ名はディレクトリ名がprefixで付く。src をソースディレクトリにした場合には src-laravel.test-1とかのコンテナ名になってしまいわかりにくい。そこで、.envに以下のパラメータを入れるとprefixを任意にできる。
COMPOSE_PROJECT_NAME=my-app
VS CodeのDev Containersを接続
機能拡張の Dev ContaintersがあるとVS Codeの環境がdocker内の環境として認識するようになる。
Containerに接続
WSLのソースルートに移動して、code . でVS Code起動。Shift+Ctrl+Pでコマンドパレットを開いて Dev Containers: Reopen in Containerを選択する。初回は色々と選択肢を選ぶウィザードが始まる。
> From : compose.yaml
From: a predefiend template
でsailのcompose.yamlを選択。次の Select Additional Featuresはどれも選択せずに大丈夫。次の include the following optinal files/directories も何も選択しない。
で、こんな設定ファイルが生成されるので次回以降はこの設定内容で接続される。
.devcontainer/ ├── devcontainer.json └── docker-compose.yml
devcontainer.json
色々とコメントがあるけど、必要なのはこれだけ。
{ "name": "docker my-app", "dockerComposeFile": [ "../compose.yaml", "docker-compose.yml" ], "service": "laravel.test", "workspaceFolder": "/var/www/html" }
serviceは最初のウィザードで選択したdockerのサービス名。compose.yaml にあるservicesのキーである。 docker composeコマンドでサービスレベルで指定しているからなのだろうか? 重要なのがworkspaceFolderでこれはdocker Containerから見たソースのパス。sailならデフォルトは/var/www/htmlなのでここを書き換えておく。
docker-compose.yml
これはdevcontainer.jsonのdockerComposeFileキーで指定されている。docker composeファイルとして上書き設定する必要があったらこのymlで設定する。基本的には上書き設定することは無いので
# volumes: # Update this to wherever you want VS Code to mount the folder of your project - ..:/workspaces:cached
の所を
# volumes: # Update this to wherever you want VS Code to mount the folder of your project # - ..:/workspaces:cached
とコメントアウトしておく。
