LaradockでLaravel環境構築【手順書】


はじめに

LaradockでLaravel環境を作る手順書です。
単純に動かすだけの手順でなく、下記点を含んでいます。

  • Laradockで2つ目の環境を構築する時に困らないための設定事項
  • 設定しておくと開発時に多少楽になるための設定事項
  • 嵌った点の備忘録

前提環境

  • docker-composeが使用できること
  • ターミナルを使用できること
    • Windowsの場合gitbashやPowerShell推奨(command promptは見づらい・文字化けの危険があるため)
  • 海外のCDNサーバにブロックされていたりしないこと
    • 短期間に環境を作りまくったせいか一部サーバに一時的にブロックされたことがあります
    • この場合ネットワークを変えることで解決したりします(ポケットwifi等)
  • 2018年以前に取得したLaradockを使用しないこと
    • Laradockの使用しているdocker-compose.ymlがv2である可能性があります

完成形

サーバ構成

  • nginx
    • + php-fpm
  • mysql
  • redis
  • APサーバ(workspace)

ディレクトリ構成

Laradockとプロジェクトディレクトリ(laravel)を同階層に置く想定です。
(プロジェクトディレクトリ下にLaradockを置きたくないので、Laradockの設定を変える作業が入ります)

my_project
├── laravel
│   ├── app
│   ├── bootstrap
│   ├── config
│   └ ...
└── laradock
    ├── adminer
    ├── aerospike
    └ ...

手順

  1. Laradock取得
  2. Laradockの設定ファイル修正
  3. Laradockビルド・アクセス
  4. Laravelインストール・yarnインストール
  5. Laravel設定ファイル修正
  6. ブラウザアクセス

1.Laradock取得

適当な場所にプロジェクト用ディレクトリを作成し、Laradockをダウンロード

$ mkdir ~/my_project
$ cd ~/my_project
$ git clone https://github.com/laradock/laradock.git

2.Laradockの設定ファイル修正

  • 設定ファイルの作成
    • .env作成
      • サーバ構成の基本となるファイルです
    • createdb.sql作成
      • テーブル構築の初期設定をしてくれるファイルです
$ cd ./laradock
$ cp -a ./env-example ./.env
$ cp -a ./mysql/docker-entrypoint-initdb.d/createdb.sql.example ./mysql/docker-entrypoint-initdb.d/createdb.sql
  • 下記ファイルを修正
.env
//document rootをlaravelにすることで、以降/laravel/を省略
- APP_CODE_PATH_HOST=../
+ APP_CODE_PATH_HOST=../laravel/

- APP_CODE_PATH_CONTAINER=/var/www/
+ APP_CODE_PATH_CONTAINER=/var/www/laravel/

//mysql等のデータ本体の置き場所。これを修正しておかないと別プロジェクト作成時に競合する。
- DATA_PATH_HOST=~/.laradock/data
+ DATA_PATH_HOST=~/.laradock/my_project/data

//コンテナ区別用prefix。これを修正しておかないと別プロジェクト作成時に競合する。
- COMPOSE_PROJECT_NAME=laradock
+ COMPOSE_PROJECT_NAME=my_project-laradock

//任意のバージョンに変更
- PHP_VERSION=7.2
+ PHP_VERSION=7.3

//laravelがmysql8.0を使うにはユーザ設定に追加で修正が必要なため5系を指定
- MYSQL_VERSION=latest
+ MYSQL_VERSION=5.7
/nginx/sites/default.conf

//他のプロジェクトと区別しやすいよう、ドメイン名を設定している(必須ではない)
- server_name localhost;
+ server_name dev.my_project.com;

//laravelディレクトリを作ったための対応
- root /var/www/public;
+ root /var/www/laravel/public;
/mysql/docker-entrypoint-initdb.d/createdb.sql

//プロジェクト用DB作成
- #CREATE DATABASE IF NOT EXISTS `dev_db_1` COLLATE 'utf8_general_ci' ;
- #GRANT ALL ON `dev_db_1`.* TO 'default'@'%' ;
+ CREATE DATABASE IF NOT EXISTS `project_db` COLLATE 'utf8_general_ci' ;
+ GRANT ALL ON `project_db`.* TO 'default'@'%' ;

// テスト用DB作成(ユーザは使いまわす想定)
- #CREATE DATABASE IF NOT EXISTS `dev_db_2` COLLATE 'utf8_general_ci' ;
- #GRANT ALL ON `dev_db_2`.* TO 'default'@'%' ;
+ CREATE DATABASE IF NOT EXISTS `test` COLLATE 'utf8_general_ci' ;
+ GRANT ALL ON `test`.* TO 'default'@'%' ;

3. Laradockビルド・アクセス

下記コマンドを実行し、サーバを構築・ビルド

$ cd ~/my_project/laradock
$ docker-compose build workspace nginx mysql redis
$ docker-compose up -d nginx mysql redis

立ち上がったら下記コマンドでworkspaceサーバへアクセス
(立ち上げに失敗したら、docker-compose logsコマンド等で状態確認して対応)

$ docker-compose exec --user=laradock workspace bash

4. Laravelインストール・yarnインストール

workspaceサーバ内で下記コマンド実行し、laravel, jsをセットアップ

laradock@~~~~:/var/www$ composer create-project laravel/laravel --prefer-dist
laradock@~~~~:/var/www$ cd laravel
laradock@~~~~:/var/www/laravel$ yarn install

5. Laravel設定ファイル修正

DBアクセスが通るよう.envを修正

.env
- DB_HOST=127.0.0.1
+ DB_HOST=mysql
- DB_DATABASE=default
+ DB_DATABASE=project_db
- DB_USERNAME=homestead
+ DB_USERNAME=default

6. ブラウザアクセス

workspaceの作業を終了し、ホストPCからdockerのwebサーバにアクセスする

hostsの修正

Windowsの場合

メモ帳を管理者で実行し、下記ファイルを修正

C\Windows\System32\drivers\etc\hosts
+ 127.0.0.1       dev.my_project.com

macの場合

/private/etc/hosts
+ 127.0.0.1       dev.my_project.com

ブラウザアクセス

ブラウザを開き、http://dev.my_project.com へアクセス
Laravelが表示されていれば完了です!


おまけ

ありがちな失敗

サーバ立ち上げに失敗してExit 1が出ている

$ docker-compose ps
                   Name                                 Command               State                                                                       Ports
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
laradock_docker-in-docker_1   dockerd-entrypoint.sh            Up       2375/tcp, 2376/tcp               
laradock_mysql_1              docker-entrypoint.sh mysqld      Up       0.0.0.0:3306->3306/tcp, 33060/tcp
laradock_nginx_1              /bin/bash /opt/startup.sh        Exit 1                                    
laradock_php-fpm_1            docker-php-entrypoint php-fpm    Up       9000/tcp                         
laradock_redis_1              docker-entrypoint.sh redis ...   Up       0.0.0.0:6379->6379/tcp           
laradock_workspace_1          /sbin/my_init                    Up       0.0.0.0:2222->22/tcp, 0.0.0.0:3000->3000/tcp, 0.0.0.0:3001->3001/tcp, 0.0.0.0:4200->4200/tcp, 0.0.0.0:8001->8000/tcp, 0.0.0.0:8080->8080/tcp

上記の場合nginxが死んでいる。
docker-compose logsコマンドで失敗原因を確認しましょう。

$ docker-compose logs nginx

nginxの立ち上げに失敗する

adduser: group 'www-data' in use
ERROR: Service 'nginx' failed to build: The command '/bin/sh -c apk update     && apk upgrade     && apk add --no-cache openssl     && apk add --no-cache bash     && adduser -D -H -u 1000 -s /bin/bash www-data' returned a non-zero code: 1

というエラーが発生した場合、
https://github.com/laradock/laradock/pull/2162/commits/8417ed2710e3491f1e74b796e032844d38ea8216
を参考に修正を行ってください。

メモリ不足でdockerが立ち上がらない

  • chrome等ブラウザを閉じる
  • dockerの設定から割り当てるメモリ量を調整する

docker-compose buildに失敗する

npm ERR! code EAI_AGAIN
npm ERR! errno EAI_AGAIN

上記のようなエラーが発生した場合、時間をおいて再ビルドすれば直ることがあります。

docker-compose up時にmysqlが起動しない

既にLaradockでプロジェクトを立ち上げたことがある場合、
そのプロジェクトとDATA_PATH_HOSTの場所被った場合立ち上げに失敗します。

DATA_PATH_HOSTを変えビルドしなおし(docker-compose build --no-cache mysql)をしたり、
既存のDATA_PATH_HOSTの中身を削除したりしてみてください。
(削除して大丈夫かはご自身でご判断ください)

docker-compose upが全体的に失敗する

過去にdocker等で仮想イメージを作ったことがある場合、
既存のものとポートが被ったりすることが多々あります。

workspace, nginx, mysql, redisのポートをずらしたりdockerを再起動したりビルドしなおしたり色々試してください。
*特に2018年までのLaradockにはCOMPOSE_PROJECT_NAMEの設定が無いため、コンテナ名が被ります

mysqlを誤って8.0で作成してしまった

Laravelは最新版でもmysql8.0標準の暗号化方法(caching_sha2_password)をサポートしていません。(2019/6/28現在)
mysql8.0を作成してしまい、そこで作ってしまったユーザでログインしたい場合、
下記のようなsqlによりパスワード設定を更新してください。

ユーザ:'default'を、パスワード:'secret'で更新

ALTER USER 'default' IDENTIFIED WITH mysql_native_password BY 'secret';

ERROR: Pool overlaps with other one on this address spaceエラーが発生した場合

$ docker-compose up -d nginx mysql redis
Creating network "laradock_backend" with driver "bridge"
ERROR: Pool overlaps with other one on this address space

上記の例の場合、laradock_backendというネットワークが既に存在し、上書きできないというエラーとなります。
まず、下記コマンドでdockerのネットワークが確認します。

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
71c487abe...        bridge              bridge              local
7c9291603...        host                host                local
95dcdfd15...        laradock_default    bridge              local
b223d9550...        none                null                local

確かにlaradock_defaultが存在するため、この場合既存のlaradock_backendネットワークを削除すれば解決します。
下記コマンドで、使用していないネットワークを全て削除できます。
使用中であった場合削除されないため、
その場合は使用していると思われるlaradockにてdocker-compose downを行ってください。

$ docker network prune
WARNING! This will remove all networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
laradock_default

Q.A

php5.4は使えないのか?

使えません。5.6以上となります。

Windows10 homeでは使えないのか?

現在のところ使えません。
どうしても使いたい人はWSL2でググると道があります。

DBにつながるか確認したい

workspace内で下記コマンド打てばテーブル作成処理が走るので、試してみるといいと思います。

$ laradock@~~~~:/var/www$ cd /var/www/laravel/
$ laradock@~~~~:/var/www/laravel$ php artisan migrate

成功後は下記コマンドでだいたい元通りにできます

laradock@~~~~:/var/www/laravel$ php artisan migrate:rollback