()

LaradockでLaravel環境構築

開発関連技術

開発環境, Docker, PHP, Laravel


Laravel を勉強するために Laradock を使用してみました。
いろんなサービスの Dockerfile が用意されていますが、まずは最低限の構成でチャレンジ。
Laradock 便利ー。

注意書き(※2021/02/24 追記)#

Laravel の Docker 環境を作成するにあたって、
現在の自分のスタンスとしては、Laradock よりもこちらの環境を使用するのをお勧めしています。
Laradock と比べて圧倒的に早く構築できます。

また、ご本人による解説記事もあり、非常に勉強になります。
特に Docker の知識に自信がない方はぜひ読んでみてください。

このスタンスのため、この記事は今後更新停止します。
ご了承ください。

前提#

  • Docker 導入済み
  • docker-compose コマンドが使用できる

こちらの記事をベースに進めました。

Laradock#

導入#

  1. 任意のプロジェクトフォルダを作成(ここが git の管理対象になるイメージ)

  2. プロジェクトフォルダに移動して、Git の設定

git init
  1. プロジェクトフォルダの中に Laravel プロジェクト用のフォルダを作成

  2. プロジェクトフォルダの中で Laradock をサブモジュールとして登録

git submodule add https://github.com/Laradock/laradock.git (※Laradock 用のフォルダ名)

この時点のフォルダ構成はこちら。

(git プロジェクトフォルダ)
├ (Laravel プロジェクトフォルダ)
└ (Laradock フォルダ)

env ファイル準備#

チームメンバーと環境変数の共有のしやすさとして、シェルを作成します。
(※2019/8/14追記 環境変数ファイルを Git にあげることでもあるので、パブリックリポジトリではやらないほうがよさそうです)

シェル作成のあたりは、以下の記事を参考にしました。

  1. シェル用のフォルダとファイルを作成(以下の.sh/
(git プロジェクトフォルダ)
├ (Laravel プロジェクトフォルダ)
├ (Laradock フォルダ)
└ .sh/
   ├ conf/
   └ setup.sh
  1. conf/のなかに.laradock-envを作成(laradock の中のenv-exampleをコピー)
    (以降、Laradock を更新した際はenv-exampleの内容が更新されている場合があるので、その際は再度合わせるようにしましょう)

  2. .laradock-envを編集

  • APP_CODE_PATH_HOST…Laradock の web サーバー上で同期するディレクトリパス
  • DATA_PATH_HOST…docker のストレージなどを保存するローカルのディレクトリパス
  • COMPOSE_PROJECT_NAME…コンテナの接頭辞(デフォルトの laradock だと、名前被りで上書きしやすいのでプロジェクトごとの命名に変更しておく)
.laradock-env
# 例
APP_CODE_PATH_HOST=../(Laravel プロジェクトフォルダ)/
DATA_PATH_HOST=../.(Laradock フォルダ)/data

COMPOSE_PROJECT_NAME=laraveltutorial
  1. setup.sh を編集
setup.sh
SCRIPT_DIR=$(cd $(dirname $0); pwd)

cd $SCRIPT_DIR

cp -f conf/.laradock-env ../(Laradockフォルダ)/.env

MySQL 8 対応#

  1. .sh/conf以下に mysql.cnf を作成(Laradock の mysql/my.cnf をコピー)

  2. .sh/conf/mysql.cnfにmysql 8 の対応として以下を追記する

.sh/conf/mysql.cnf
innodb_use_native_aio=0
default_authentication_plugin=mysql_native_password

DockerでPHP環境作成(+ MySQL + PHPMyAdmin)でも書いたとおり、MySQL は8から認証方式が変更になっているため、それを従来の認証方式に設定しなおすものです。
※追記 innodb_use_native_aio=0 については、他のバージョンでも必要の可能性あり。

  1. .sh/setup.shに以下を追加
.sh/setup.sh
cp -f conf/mysql.cnf ../ (Laradockフォルダ)/mysql/my.cnf
  1. setup.sh を実行して .env を作成 + mysql/my.cnf の更新
sh .sh/setup.sh

docker の起動#

  1. イメージの作成と起動( laradock フォルダに移動して)
docker-compose up --build -d nginx mysql

※起動するコンテナは使用したいものに応じて変化。
初回は作成に少し時間がかかるので気長に待ちましょう。

  1. 起動イメージの確認
docker-compose ps

State がすべて Up になっていればOK。
(workspace と php-fpm も一緒に起動しているはず)

  1. 動作確認
    http://localhostにアクセス。
    この段階では、nginx の404画面になればOK。

Laravel プロジェクト#

作成#

  1. workspace コンテナに入る
docker-compose exec workspace bash
  1. Laravel のインストール
composer create-project --prefer-dist laravel/laravel ./
  1. 動作確認
    http://localhostにアクセス
    以下の Laravel のトップページが表示されれば OK
Laravelトップ画面

MySQL の接続設定#

  1. Laravel プロジェクトの.envを修正
    接頭辞が DB_ の部分を編集し、laradock フォルダ/.env に記述されている値と合わせる形になります。
.env
# 例
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret
  1. マイグレーションを実行して接続テスト
    workspace コンテナの中で以下コマンドを実行。
php artisan migrate

デフォルトで存在するマイグレーションファイルが実行されます。ちゃんとテーブルが作成されていればOK。

Laravel の env ファイル準備#

こちらもシェルで env ファイルの内容を共有できるようにしておきます。

  1. .sh/conf.laravel-envを作成
    (Laravel プロジェクトの.envをコピー)

  2. setup.sh に以下を追記する

setup.sh
cp -f conf/.**laravel**-env ../(Laravel プロジェクトフォルダ)/.env

他のメンバーが環境を作るときは#

  1. プロジェクトをクローン
git clone (プロジェクトパス)
  1. サブモジュールの内容をクローン
git submodule update -i

※Laradock のディレクトリに移動し、git submoduleで状態が確認できる
-c7289f7db3b96be585a879ceaf0f208102f8233f ./ のように頭に-がついている場合は、まだ中身を持ってこれてない状態。

  1. シェル実行で env ファイル作成 + mysql 設定ファイルコピー
sh .sh/setup.sh
  1. docker のイメージ作成と起動
docker-compose up --build -d nginx mysql

※作成するコンテナは必要に応じて。

  1. 起動イメージの確認
docker-compose ps

State がすべて Up になっていれば OK。

  1. workspace コンテナに入る(2019/12/7追記)
docker-compose exec workspace bash
  1. パッケージのインストール(2019/12/7追記)
composer install
  1. テーブルの作成(2019/12/7追記)
php artisan migrate
  1. 動作確認
    http://localhostにアクセス。
    ちゃんとコードに応じた画面が表示されれば OK。

最初は MySQL 8対応で少し手間取りましたが、比較的楽に環境を作ることができました。
Laradock には豊富に Dockerfile が用意されているので、必要に応じてコンテナがすぐ作成できるのはいいですね。
機会があれば他のコンテナも試してみます。

参考リンクまとめ#