Help us understand the problem. What is going on with this article?

Laravelの開発環境をLaradockを使って構築する

この記事は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のウェルカムページが表示できるようになっています。

http://localhost

https://i.gyazo.com/ea78a7d72c1ce18067dfcecb811283e1.png

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 へダウングレードする必要があります。
下記を参照ください。

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

http://localhost:8888

https://i.gyazo.com/ea78a7d72c1ce18067dfcecb811283e1.png

8888ポート番号を指定してブラウザからアクセスし、LaravelのWelcome画面が表示されていればokです。

Tableplusでログインする

スクリーンショット 2019-05-06 23.50.07.png

  • Name: laradock 任意
  • Ver: MySQL 8.x
  • User: default
  • Password: secret

あとは初期値のままで Connect からログインする。

PHPMyAdminでログインする

http://127.0.0.1:8080

スクリーンショット 2019-05-06 23.45.26.png

  • サーバ: mysql
  • ユーザ名: default
  • パスワード: secret
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away