search
LoginSignup
2
Help us understand the problem. What are the problem?

DMM WEBCAMP Advent Calendar 2021 Day 17

posted at

updated at

Laravel8をDocker環境で構築し、ログインまで

はじめに

こんにちは。DMM WEBCAMP Advent Calendar 2021 17日目を担当する@yuttana1223です!:slight_smile:
最近1年ぶりにLaravelを使用するということになったので、そのときに学習した内容で需要がありそうな開発環境に関して書いていきます。

概要

Laravel sailでDocker環境を構築して、Breezeでログインまで行っていきます。基本的には公式ドキュメントを参考にし、便利なもののインストールや日本語化は行いますが、不必要な場合は飛ばしてください。チーム開発のことも考え、GitHubにpush後cloneしてからの扱い方まで考慮していきます。

実行環境

  • macOS Big Sur バージョン 11.5.2
  • docker desktop バージョン 4.1.1(インストールしていて、起動している前提)

Laravelプロジェクト作成

Laravel Sailを使用していく。

Laravel Sailは、LaravelのデフォルトのDocker構成と、操作するための軽量のコマンドラインインターフェイスです。 Sailは、Dockerの経験がなくても、PHP、MySQL、Redisを使用してLaravelアプリケーションを構築するために良い出発点を提供しています。

利用可能なサービスは、mysqlpgsqlmariadbredismemcachedmeilisearchminioseleniummailhogになっており、withというクエリ文字列変数で選択する。

docker imageやプロジェクトに必要なファイルをインストール

今回はmysqlを選択し、アプリ名はexample-appを使用する。インストールには結構時間がかかるので気長に待ち、最後にmacのパスワードだけ聞かれるので入力しましょう。

# curl -s "https://laravel.build/アプリ名?with=サービス名,サービス名" | bash
curl -s "https://laravel.build/example-app?with=mysql" | bash

cd example-app
# gitの管理下に入れたい場合のみ
git init

参考: https://readouble.com/laravel/8.x/ja/installation.html

環境変数(.env)のファイルをお好みで変更

  • docker-compose.ymlAPP_PORTという環境変数が指定されている(デフォルトだと80番)ので、自分のPCで使っていないポート番号を追記する。
  • お好みでAPP_NAME(アプリ名)やDB_DATABASE(データベース名)、DB_USERNAME(データベースのユーザー名)、DB_PASSWORD(データベースのパスワード)も変更してください。今回は特に変更せず、デフォルトのままで行う。
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:mwWgIvS9K4seI+GQ+F7DOslToBuIRgw7ibXje8A9etI=
APP_DEBUG=true
APP_URL=http://example-app.test
APP_PORT=8000 # 追記(http://localhost:8000/ で接続)

# 以下省略

言語設定(config/app.php)

  • 'fallback_locale' => 'en'は変更しなくてよい
  • 大文字小文字を気をつける
// 変更前
// 'timezone' => 'UTC',
// 変更後(タイムゾーンを東京に変更)
'timezone' => 'Asia/Tokyo',

// 変更前
// 'locale' => 'en',
// 変更後(言語を日本語に変更)
'locale' => 'ja',

// 変更前
// 'faker_locale' => 'en_US',
// 変更後(ダミーデータを日本語に変更)
'faker_locale' => 'ja_JP',

phpMyAdminを導入(docker-compose.yml) ※任意

  • データベースをGUIからも扱うためのもので、テーブルやどんなデータが入っているかをひと目で確認できたり、簡単にデータを挿入・変更・削除したりできて便利。
  • mariadbなどを使用している場合はphpmyadmindepend_onの部分のmysqlmariadbなどに変更する
# For more information: https://laravel.com/docs/sail
version: '3'
services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.0
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.0/app
        extra_hosts:
            - 'host.docker.internal:host-gateway'
        ports:
            - '${APP_PORT:-80}:80'
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
            XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
            XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - mysql
    mysql:
        image: 'mysql/mysql-server:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ROOT_HOST: "%"
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 1
        volumes:
            - 'sailmysql:/var/lib/mysql'
        networks:
            - sail
        healthcheck:
            test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
            retries: 3
            timeout: 5s
# 追記
    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        restart: always
        environment:
            PMA_ARBITRARY: 1
            PMA_HOST: "${DB_HOST}"
            PMA_USER: "${DB_USERNAME}"
            PMA_PASSWORD: "${DB_PASSWORD}"
        ports:
            - 8080:80
        volumes:
            - ./infra/docker/phpmyadmin/sessions:/sessions
        networks:
            - sail
        depends_on:
            - mysql
networks:
    sail:
        driver: bridge
volumes:
    sailmysql:
        driver: local

エラーメッセージの日本語化 ※任意

  • デフォルトの英語のままでOKなら飛ばす
  • 公式にもエラーメッセージの日本語化があるが、既にカスタムされているものを今回は使用。
  1. 次ののURLにアクセスし「https://github.com/Laravel-Lang/lang
  2. ダウンロードしてくる
  3. ダウンロードしてきたlang/localesの中のjaを自分のプロジェクトのresources/langの直下に入れる。
  4. 自分のプロジェクトのresources/lang/jaの中のja.jsonを上の階層resources/lang直下に移動
  5. スクリーンショット 2021-11-27 18.37.54.png

補足: https://readouble.com/laravel/8.x/ja/validation-php.html

コンテナを起動

docker compose up -dと同じような意味

./vendor/bin/sail up -d

http://localhost:8000/ 」でlaravel、「 http://localhost:8080/ 」でphpMyAdminが起動した状態になる

laravel-debugbarのインストール ※任意

デバッグをするときに便利なので入れる
docker compose exec laravel.test bashでもコンテナに入れる

# コンテナ内に入る
./vendor/bin/sail bash
# インストール
composer require barryvdh/laravel-debugbar --dev

Laravel Breezeのインストール

  • 認証に必要なので入れる

Laravel Breezeにログイン、ユーザー登録、パスワードのリセット、メールの検証、パスワードの確認など、Laravelのすべての認証機能を最小限シンプルに実装しました。Laravel Breezeのデフォルトビュー層は、Tailwind CSSでスタイルを設定したシンプルなBladeテンプレートで構成しています。

# コンテナ内で実行
composer require laravel/breeze --dev
php artisan breeze:install
# tailwind cssなどを使用しているため必要
npm install && npm run dev
# usersテーブルなどのマイグレーションを実行
php artisan migrate

これで右上のRegisterのリンクからユーザ登録ができるようになった。

GitHubにpushしたものをcloneしてからの流れ

チーム開発のときなどにGithubを使用すると思うが、そのときに注意点がある。
.gitingnore/vendorと書かれているので、コマンド時に使用していた./vendor/bin/sailが使用できない。/vendor/bin/sailcurlを使用したときに現れたものである。
対策としては公式に書かれている。

PHPとComposerを含む小さなDockerコンテナを使用して、アプリケーションの依存関係をインストールする必要がある。

GitHubからcloneする

git clone リポジトリURL
# cloneしてきたプロジェクトに移動
cd example-app

環境変数(.env)を作成

  • GitHubには.envはpushされないようになっているので、まずは.env.exampleの中身をコピーして.envファイルを作成してから貼り付ける
  • DB_CONNECTIONDB_HOSTは使用しているデータベース名(今回はmysql)を記述し、DB_PASSWORDも設定(今回はpassword)。
  • APP_NAMEAPP_PORTDB_DATABASEDB_USERNAMEはお好みで記述。
APP_NAME=Laravel
APP_ENV=local
# APP_KEYはエラーが出たときにコマンドで生成
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
# 書かなければ80になる
APP_PORT=8000

LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

# mysqlを使用
DB_CONNECTION=mysql
# mysqlに変更
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=example_app
# userに変更
DB_USERNAME=user
# passwordに変更
DB_PASSWORD=password

# これより下は変更なし

BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DRIVER=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

MEMCACHED_HOST=127.0.0.1

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

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}"

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

コンテナを起動する

  • /vendorやdockerのイメージをインストール (dockerデスクトップは起動している前提でfishを使用している場合はzshやbashに切り替える)
docker run --rm \
    -u "$(id -u):$(id -g)" \
    -v $(pwd):/var/www/html \
    -w /var/www/html \
    laravelsail/php80-composer:latest \
    composer install --ignore-platform-reqs

./vendor/bin/sail up -d

http://localhost:8000/ にアクセスすると、No application encryption key has been specified.というエラーが出るのでAPP_KEYを作成。

# コンテナに移動
./vendor/bin/sail bash
# APP_KEYを作成
php artisan key:generate

npm install && npm run dev
php artisan migrate

http://localhost:8080/ にアクセスすると、テーブルができているのが確認できる。

以上でcloneをしてからログインまで完了!

参考: https://readouble.com/laravel/8.x/ja/sail.html

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2
Help us understand the problem. What are the problem?