【Laravel】Laradockで複数プロジェクトを動かす手順

Laradock1つで複数のプロジェクトを動かしていきたいと思います。

Laradockの複数プロジェクトにおけるディレクトリ構成

下記のようなディレクトリ構成にしたいと思います。DBは共通のユーザーでログインして、複数作るイメージです。(your-dev-folderは普段開発で使うフォルダの場所です。)

(your-dev-directory)/laradock

(your-dev-directory)/project1/app
(your-dev-directory)/project1/public
(your-dev-directory)/project/(省略...)

(your-dev-directory)/project1/app
(your-dev-directory)/project1/public
(your-dev-directory)/project1/(省略...)

Laradockをクローン

まずはlaradockをクローンしてきましょう。どこでも良いですが一例としてぼくはホームフォルダ(/Users/[ユーザー名])にdevフォルダを作っています。

/Users/{ユーザー名}/dev

ここにLaradockをクローンしてきます。

git clone https://github.com/Laradock/laradock.git laradock

Laradockの.env設定

クローンできたら、laradockフォルダに移動して、env-exampleというLaradockの環境設定例のファイルを.envとしてコピーします。

cd laradock
cp env-example .env

コピーした.envの内容を編集しましょう。デフォルトではmysqlがlatestとなっていますが、最新版に設定するとエラーが出たりするので5.7を指定します。

他の設定は適宜変更してください。
編集ファイル: laradock/.env

### MYSQL #################################################

MYSQL_VERSION=5.7

Laradockでnginxの複数サイト設定

project1.localやproject2.localでアクセスした時に、それぞれのプロジェクトが表示されるように設定を行います。

laradock/nginx/sites/laravel.conf.example に設定例があるのでこれをコピーして書き換えていきます。

Project1とproject2という2つのサイトを動かす前提で話を進めます。

作業ディレクトリ: laradock/nginx/sites

cd nginx/sites
cp laravel.conf.example project1.conf
cp laravel.conf.example project2.conf

larave.conf.exampleではlaravelというフォルダで動かすようにかかえれているので、そのlaravel部分をproject1という風に書き換えます。

またproject1.testだとchromeで動かなかったりするのでproject1.localとしています。

server_name project1.local
root /var/www/project1/public;

...(省略)

error_log /var/log/nginx/prject1_error.log;
access_log /var/log/nginx/prject1_access.log;

project2.confを同様に行いましょう。

hostsの設定を行う

Nginxでdocker上のサイト設定は行いましたが、これだけではローカルPC上で http://project1.local/にアクセスしてもなにも表示されません。

hostsの最下部に下記のように追記しましょう。
編集ファイル: /private/etc/hosts

127.0.0.1	project1.local
::1 project1.local
127.0.0.1	project2.local
::1 project2.local

LaradockのMYSQLでDBを複数用意する

createdb.sql.example というファイルをcreatedb.sql としてコピーして、DBを作成するsqlを書きます。

作業ディレクトリ: laradock/mysql/docker-entrypoint-initdb.d/

cd mysql/docker-entrypoint-initdb.d/
cp createdb.sql.example createdb.sql

CREATE DATABASE …と書いてある部分2行をFLUSH PRIVILEGES ;の上部にコピペして挿入します。ここでは、project1という名前でdatabaseを作成します。

編集ファイル: laradock/mysql/docker-entrypoint-initdb.d/createdb.sql

CREATE DATABASE IF NOT EXISTS `project1` COLLATE 'utf8_general_ci' ;
GRANT ALL ON `project1`.* TO 'default'@'%' ;

CREATE DATABASE IF NOT EXISTS `project2` COLLATE 'utf8_general_ci' ;
GRANT ALL ON `project2`.* TO 'default'@'%' ;

FLUSH PRIVILEGES ;

(先頭の#はコメントになるので外すのを忘れないようにしてください)

次に実際にDBを作成します。laradockフォルダへ移動して下記を実行します。(#はコメント行です。)

作業ディレクトリ: laradock

# dockerでmysqlを立ち上げる
docker-compose up -d mysql

# rootユーザーでsqlを実行
# 「Enter password:」と表示されるので、rootと入力
mysql -u root -p < /docker-entrypoint-initdb.d/createdb.sql

# DBが作成されたか確認しましょう。
# project1、project2があればok
mysql -u root -p
show databases;

作業が終わったらmysqlとbashからexitコマンドで抜け出します。

LaradockのworkspaceでLaravelインストール

こちらは標準のLaravelの設定を行うときと同様です。Laradockではworkspaceと呼ばれる場所に予め必要なものがまるっと入っているのでそのworkspace内で作業をします。

以降workspace内と言えば docker-compose exec --user=laradock workspace bashを行っている状態ということです。

# workspaceを立ち上げ、laradockユーザーでworkspaceに入る
docker-compose up -d workspace
docker-compose exec --user=laradock workspace bash

ここでls コマンドを行うとローカルでlaradockを置いているフォルダの中身が/var/www/に配置されている事がわかります。

ここにproject1、project2という名前でLaravelをインストールしましょう。project1のみで説明します。

Laravelインストール

workspace内でlaravelをインストール

composer create-project --prefer-dist laravel/laravel project1

Laravelの.env編集

.envをlaradockで作成したDBの接続情報と合うように編集します。ローカルPC上で普通にエディタで編集すればokです。

DB_HOST、DB_DATABASE、DB_USERNAMEを書き換えます。
編集ファイル: project1/.env

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=project1
DB_USERNAME=default
DB_PASSWORD=secret

workspace内でLaravelのmigrationを行う

workspace内でproject1ディレクトリに移動しmigrationを行います。

作業ディレクトリ(workspace内): /var/www/project1

cd project1
php artisan migrate

以上でproject1のインストールが完了です。同様にproject2も行いましょう。

ブラウザで表示されるかを確認

設定は以上です。workspaceから抜け出し、ローカルPC上でlaradockを起動して確認してみましょう。

docker-compose up -d nginx mysql

ブラウザでhttp://project1.local/にアクセスして初期画面が表示されればokです!

もし表示されない場合やnginxのサイト設定を間違っていた場合は一度docker-composeで停止してから再度たちあげましょう。

docker-compose stop
docker-compose up -d nginx mysql

以上です!laradockで素敵なLaravel開発ライフをお過ごしくださいませ〜

追記

もう一つパターンがあったので書いていきます

Laradockをプロジェクトの数だけ作る場合の手順

ドキュメントにもありますが下記のような構成です。

+ project-a
  + laradock-a(Laradockのフォルダ)
+ project-b
  + laradock-b(Laradockのフォルダ)

ポイントはプロジェクトごとにユニークなフォルダの名前をつけることで、このフォルダ名を基にコンテナが作られるとあるのですが… 動かなかったのでlaradock/.envのCOMPOSE_PROJECT_NAME をユニークにすることで対応しましょう。

編集ファイル: laradock-a/.env

COMPOSE_PROJECT_NAME=laradock_project-a

(It’s important to rename the laradock folders to unique name in each project, if you want to run laradock per project).

By default the containers that will be created have the current directory name as suffix (e.g. laradock_workspace_1).

また、デフォルトではデータベースを保存する場所が~/.laradock/data となっており、共通のものが使われてしまうため下記のように変更します。

DATA_PATH_HOST=.laradock-a/data

これでプロジェクトごとにコンテナを作ることが可能となります。他の流れは一緒になりますので省略させていただきます。