はじめに
LaradockでLaravel環境を作る手順書です。
単純に動かすだけの手順でなく、下記点を含んでいます。
- Laradockで2つ目の環境を構築する時に困らないための設定事項
- 設定しておくと開発時に多少楽になるための設定事項
- 嵌った点の備忘録
前提環境
- docker-composeが使用できること
- Windowsの場合Windows10 Proであること
- Windows10 Homeである場合、Linuxを立ち上げてその中で作業する必要があります(下記は参考例)。
- docker-composeがインストールされていること
- Windowsの場合Windows10 Proであること
- ターミナルを使用できること
- 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
└ ...
手順
- Laradock取得
- Laradockの設定ファイル修正
- Laradockビルド・アクセス
- Laravelインストール・yarnインストール
- Laravel設定ファイル修正
- ブラウザアクセス
1.Laradock取得
適当な場所にプロジェクト用ディレクトリを作成し、Laradockをダウンロード
$ mkdir ~/my_project
$ cd ~/my_project
$ git clone https://github.com/laradock/laradock.git
2.Laradockの設定ファイル修正
- 設定ファイルの作成
- .env作成
- サーバ構成の基本となるファイルです
- createdb.sql作成
- テーブル構築の初期設定をしてくれるファイルです
- .env作成
$ cd ./laradock
$ cp -a ./env-example ./.env
$ cp -a ./mysql/docker-entrypoint-initdb.d/createdb.sql.example ./mysql/docker-entrypoint-initdb.d/createdb.sql
- 下記ファイルを修正
//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
//他のプロジェクトと区別しやすいよう、ドメイン名を設定している(必須ではない)
- server_name localhost;
+ server_name dev.my_project.com;
//laravelディレクトリを作ったための対応
- root /var/www/public;
+ root /var/www/laravel/public;
//プロジェクト用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を修正
- 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の場合
メモ帳を管理者で実行し、下記ファイルを修正
+ 127.0.0.1 dev.my_project.com
macの場合
+ 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