Laradockの使い方をメモっとく


こんな感じにします。

  1. blogという名前でlaravelディレクトリをつくる
  2. laravel5.5 mysql8 nginxという構成

【注意点】
最初のdocker-compose upはとても時間がかかる。
mysqlはlatestとなっているのでversionは自動的にmysql8になる

project
laradock
blog

永続化しするファイルの場所をプロジェクト内にする

これはお好みで

laradockの.env
# Choose storage path on your machine. For all storage systems
DATA_PATH_HOST=.laradock/data

nginxのルートのディレクトリ変更

default.cnf
root /var/www/ 「laravelのプロジェクト名」 /public;

mysalのconfに追記

# The MySQL  Client configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysql]
default-character-set=utf8mb4

[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
default-authentication-plugin = mysql_native_password
character_set_server=utf8mb4
init-connect='SET NAMES utf8mb4'
collation_server=utf8mb4_unicode_ci
skip-character-set-client-handshake

使うimageを指定してdocker-compose

docker-compose up -d nginx mysql

mysqlについて

laradockではrootとdefaultの2つのユーザーがある

laradockの.envにこのように記載がある

なので、2つのユーザーが存在する

  • 全権限をもっとrootユーザー
  • defaultデータベースのみの権限を与えられたdefaultユーザー
### MYSQL #################################################

MYSQL_VERSION=latest  #最新version
MYSQL_DATABASE=default  #DB名 default
MYSQL_USER=default      #DBユーザー名 default
MYSQL_PASSWORD=secret   #上記ユーザーのパスワード
MYSQL_PORT=3306         
MYSQL_ROOT_PASSWORD=root  #rootユーザーのパスワードもrootに設定
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d

mysqlに入りたい

docker exec -it mysqlのid bash

とりあえずrootで入る

mysql -u root -p
#パスワードもroot

laravel本体をインストール

下記のディレクトリ構成になるようにインストール
laradockとは並列になるディレクトリ構成に。

project
laradock
└ laravel本体

composer create-project --prefer-dist laravel/laravel プロジェクト名 "5.5.*"

laravelの設定ファイルをいろいろ

.envファイル

とりあえずmysqlユーザーはrootでやるならこれ

DB_CONNECTION=mysql
DB_HOST=mysql       #変更
DB_PORT=3306 
DB_DATABASE=default #変更
DB_USERNAME=root    #変更
DB_PASSWORD=root    #変更

こんなエラーがでる

mysql8の認証プラグイン問題


PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]

MySQL5.7までの認証プラグインには mysql_native_password がデフォルトで使用されていたが、
MySQL8から追加されたcaching_sha2_passwordという認証プラグインに変更された

現状のユーザーの認証方法を確認してみる

SELECT user, host, plugin FROM mysql.user;


mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| default          | %         | caching_sha2_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 |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)

全部、caching_sha2_password となっていますね。

では、デフォルトに設定されている認証プラグインを確認

show variables like 'default_authentication_plugin';

じゃあユーザーの認証方法変更しちゃおう

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'P@ssw0rd';

ちなみにP@ssw0rdてやっているはわざとです。
下記だとダメです。
このパスワードもルールがあるので。

ダメなパターン

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

文字化けすんじゃねーか

mysqlの文字コードを確認

docker-compose exec mysql bash

mysql -u root -p
P@ssw0rd
show variables like '%char%';

mysql8から下記はデフォルトがutf8になっている

character_set_database
character_set_server


[mysql]
# 追加
default-character-set=utf8mb4

[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
default_authentication_plugin=mysql_native_password

#追加
init-connect='SET NAMES utf8mb4'
collation_server=utf8mb4_unicode_ci
character_set_server=utf8mb4
skip-character-set-client-handshake

1、DATA_PATH_HOST=~/.laradock/dataの中にmysqlディレクトリがあって、こいつをディレクトリごと削除
2、laradock_mysqlのイメージを削除
3、mysqlのイメージを削除
4、mysqlをno-cacheで再build

rm -rf ~/.laradock/data/mysql
docker rmi laradock_mysql -f 
docker rmi mysql -f

docker-compose build --no-cache mysql

mysqlのmy.cnfを書き換えた後、反映させたい!

docker-compose stop
#永続化されているデータを丸っと削除
rm -rf .laradock
#mysqlを再度build
docker-compose up -d --build mysql

ふう