この記事はLaravel #2 Advent Calendar 2018 20日目の記事です。
枠が余っていたので投稿しました!
Laradockを使って環境構築をする機会があったのでその時のメモを残します。
Homestead で環境構築した記事もあります。
Laradockとは
LaradockとはDocker作られたのオールインワンなPHP開発環境です。
素晴らしいPHP開発環境を提供するように事前にパッケージ化されたDockerイメージが含まれています。
Laradockの特徴
- PHPのバージョンを簡単に切り替えできる(7.3/7.2/7.1/5.6)
- 好きなデータベースエンジンを選択できる(MySQL/Postgres/MariaDB...)
- Memcached、HHVM、Beanstalkdなど、独自のソフトウェアの組み合わせが可能
- PHP-FPM、NGINX、PHP-CLIなど、すべてのソフトウェアは別々のコンテナ上で動作
- すべてのDockerイメージは公式ベースのイメージから構築
- プロジェクトごとにLaradockを使用することも、すべてのプロジェクトに対して単一のLaradockを使用することも可能
実際の現場では
Laradockは全部入りな環境のため、大体のプロジェクトにはオーバースペックであり、メンテナンスコストが高いです。
初回ビルドに時間がかかるため、1人チームだといいですが何人も人員がいると構成が変わるたびにビルドし直して〜のコストはバカにならないです。
なので仕事ではLaradockは使用しません。開発環境や本番環境にLaradock使ってるよ的な話は私の周りでは聞いたことないです...。
実際の現場では Laravelの開発環境をDockerを使って構築する のこちらの記事を元に開発をしてます。
事前準備
Dockerインストール
Dockerのインストールはhomebrew caskから簡単にインストールが行えます。
$ brew cask install docker
$ open /Applications/Docker.app
Kitematicインストール
DockerコンテナをGUIで管理できます。
今回は使用しませんが、入れておくと便利です。
$ brew cask install kitematic
$ open /Applications/Kitematic.app
TablePlusインストール
RDB用のGUIツール。MySQL8.0系にも対応してます。
phpmyadminよりTablePlusの方が使いやすいのでインストール推奨です。
Dockerバージョン
$ docker -v
Docker version 18.09.0, build 4d60db4
$ docker-compose -v
docker-compose version 1.23.2, build 1110ad01
$ docker-machine -v
docker-machine version 0.16.0, build 702c267f
ディレクトリ構成について
今回は、このようなディレクトリ構成で進めていきたいと思います。
環境構築の際に触れるファイルの位置も確認しておきましょう。
~/work => 作業用ディレクトリ
~/work/laradock => Laradockの環境
~/work/laradock/.env => Laradockの環境設定ファイル
~/work/laradock/mysql/my.cnf => LaradockのMySQL設定ファイル
~/work/sampleapp => Laravelの環境
~/work/sampleapp/.env => Laravelの環境設定ファイル
Laradockのダウンロード
$ cd ~
$ mkdir work
$ cd work
$ git clone https://github.com/laradock/laradock.git
今回はホームディレクトリ直下に作業ディレクトリ(work)を作成しました。
作業ディレクトリにLaradockをgit cloneしてダウンロードします。
Docker環境の設定
$ cd laradock
$ cp env-example .env
laradockディレクトリへ遷移して、Laradock環境設定ファイルのひな形をコピーして .env
ファイルを作成します。
MySQL8.0 を使用する場合
この記事の執筆時のMySQL8系ではデフォルト認証方式が caching_sha2_password
に変更されています。
PHPのMySQL接続ライブラリが対応していない問題があり、元の認証方式である mysql_native_password
に設定する必要があります。
詳しい内容は過去の記事 MySQL8.0 認証方式を変更する を参照ください。
~/work/laradock/mysql/my.cnf
ファイルの [mysqld]
セクションに追記します。
# The MySQL Client configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
[mysql]
[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
character-set-server=utf8
# 追記
default-authentication-plugin=mysql_native_password
Docker環境の構築
$ docker-compose up -d nginx mysql workspace phpmyadmin
...
Creating laradock_mysql_1 ... done
Creating laradock_docker-in-docker_1 ... done
Creating laradock_workspace_1 ... done
Creating laradock_phpmyadmin_1 ... done
Creating laradock_php-fpm_1 ... done
Creating laradock_nginx_1 ... done
最終的に、上記のようにコンテナが作成完了すればokです。
ここでコンテナを指定しないで docker-compose up -d
とするとLaradockで定義されている全てのコンテナが構築されてしまいます。
これは相当な時間がかかるので、必要最小限のコンテナを指定します。
あと、通信量も多いのでモバイルルーターやテザリング、ネットワーク弱い場所では注意してください。
Docker環境のバージョン
$ docker-compose run workspace php -v
Starting laradock_docker-in-docker_1 ... done
PHP 7.2.4-1+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Apr 5 2018 08:53:57) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.4-1+ubuntu16.04.1+deb.sury.org+1, Copyright (c) 1999-2018, byZend Technologies
$ docker-compose run nginx nginx -v
nginx version: nginx/1.15.7
$ docker-compose run mysql mysql -V
mysql Ver 8.0.13 for Linux on x86_64 (MySQL Community Server - GPL)
※執筆時点のバージョンです
Laravelプロジェクトの作成
$ docker-compose exec --user=laradock workspace bash
$ composer create-project laravel/laravel sampleapp --prefer-dist "5.5.*"
$ exit
Laradockの環境設定ファイルを変更
.env
APP_CODE_PATH_HOST=../sampleapp
サンプルアプリの場所を指定します。
docker 再起動
Laradockの .env
を変更した場合、反映させるためにdockerの再起動が必要です。
$ docker-compose stop
$ docker-compose up -d nginx mysql
Laravel Welcomeページを表示する
ここまで設定ができてれいれば、Laravelのウェルカムページが表示できるようになっています。
Laradock MySQLコンテナ
MySQL接続情報
- データベース: default
- ユーザー名: default
- パスワード: secret
- rootユーザーのパスワード: root
Laravel MySQL接続設定
workspaceコンテナに入り、Laravelの .env
ファイルを変更します。
$ docker-compose exec --user=laradock workspace bash
.env
ファイルのデータベース設定項目を下記の設定に書き換えます。
DB_CONNECTION=mysql
DB_HOST=mysql # 変更
DB_PORT=3306
DB_DATABASE=default # 変更
DB_USERNAME=default # 変更
DB_PASSWORD=secret
DB_HOST=mysql
ホスト名でmysqlコンテナを指定します。
$ php artisan migrate
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table
上記のようにマイグレーションが実行できていればokです。
補足
MySQL認証方式の確認
mysqlコンテナにログイン、MySQLにログインして認証方式を表示するSELECT文を実行する。
$ docker-compose exec mysql bash
$ mysql -uroot -proot
> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| default | % | mysql_native_password |
| root | % | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
defaultユーザーのpluginが mysql_native_password
となっていればokです。
あとから認証方式を変更する(my.cnf)
my.cnf
の追記を忘れた場合は、mysqlコンテナの再ビルドが必要です。
~/.laradock/data
にMySQLのデータが格納されるのでここも破棄しないと変更が反映されません。今回は ~/.laradock
ごと削除します。
# my.cnfを修正しておく
$ docker-compose stop
$ rm -rf ~/.laradock
$ docker-compose up -d --build mysql
MySQL認証方式が変更されているか確認しましょう。
~/.laradock
を削除するとテーブル
あとから認証方式を変更する(SQL)
SQLを実行して認証方式を変更してもokです。
$ docker-compose exec mysql bash
$ mysql -uroot -proot
> ALTER USER 'default'@'%' IDENTIFIED WITH mysql_native_password BY 'secret';
> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| default | % | mysql_native_password |
| root | % | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
Sequel Pro(MySQL8.0)
執筆時のSequel Pro最新バージョン1.1.2はMySQL8.0に対応していません。
バージョン1.2でMySQL8.0に対応予定です。
Sequel Proを使いたい場合は MySQL5.7 へダウングレードする必要があります。
下記を参照ください。
- http://laradock.io/documentation/#change-the-mysql-version
- https://github.com/sequelpro/sequelpro/issues/2699
MySQL5.7にダウングレードする
最終的にはSequel Proも使えるし、MySQL5.7にダウングレードした方が開発しやすいです。
laradock/.env
を変更する
### MYSQL #################################################
#MYSQL_VERSION=latest
MYSQL_VERSION=5.7
MySQLのバージョンを最新(latest)から5.7に変更する
$ docker-compose stop
$ rm -rf ~/.laradock
$ docker-compose up -d --build mysql
$ docker-compose exec mysql bash
# mysql --version
mysql Ver 14.14 Distrib 5.7.24, for Linux (x86_64) using EditLine wrapper
nginxのポート番号を変更する
80ポートが他のアプリで使用している場合、エラーになってしまいます。
laradock/.env
ファイルでポート変更できます。
必ずしも変更する必要はありません。
### NGINX #################################################
#NGINX_HOST_HTTP_PORT=80
NGINX_HOST_HTTP_PORT=8888
nginxのポート番号を 80
=> 8888
など任意のポート番号に変更します。
$ docker-compose stop
$ docker-compose up -d --build nginx
8888ポート番号を指定してブラウザからアクセスし、LaravelのWelcome画面が表示されていればokです。
Tableplusでログインする
- Name:
laradock
任意 - Ver:
MySQL 8.x
- User:
default
- Password:
secret
あとは初期値のままで Connect
からログインする。
PHPMyAdminでログインする
- サーバ:
mysql
- ユーザ名:
default
- パスワード:
secret