MySQL沼にハマったの巻@大人プログラミング部

こんばんは。山崎 代三です。

つい先程アムレスのオンラインストア向けのブログを書き終わったばかりですが、休む間もなく、こちらを書きます。

本日の大人プログラミング部での目標は、
1. Sublime text のインストール
2. Laradock インストールの続き
3. 公式チュートリアルアプリを作る
でした。

Sublime textは Ubuntu の GUIインストーラーから難なくインストールできました。GUIっていいですね。

『Laradockインストールの続き』

まずは、.env ファイルのDB設定変更。

↓こうなっている部分を

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

↓こうするらしいです。

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret

で、docker-compose 起動

$ docker-compose up -d nginx mysql phpmyadmin

状況確認します。

$ docker ps --format "table {{.Names}}"
NAMES
laradocklaratuto_nginx_1
laradocklaratuto_php-fpm_1
laradocklaratuto_workspace_1
laradocklaratuto_phpmyadmin_1
laradocklaratuto_docker-in-docker_1
laradocklaratuto_mysql_1

workspaceコンテナに接続して Laravel artisan も確認します。

$ docker-compose exec workspace bash
# php artisan --version
Laravel Framework 6.0.1
# exit

ええやん!

トラブル – mysql のテーブルが見えない

続いて mysqlコンテナに接続して defaultデータベースのテーブルを見ることにします。

$ docker-compose exec mysql bash
# mysql --version
mysql  Ver 8.0.17 for Linux on x86_64 (MySQL Community Server - GPL)
# mysql -u default -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.17 MySQL Community Server - GPL
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

なんか超久しぶりの mysql ターミナルでドキドキします。

mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| default |
| information_schema |
+--------------------+
2 rows in set (0.03 sec)

ここまでは良かった……。

mysql> SHOW TABLES FROM default;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'default' at line 1

omg! シンタックスエラー!!!

ちなみに、

SHOW TABLES FROM information_schema;

は、まったく問題なく表示できます。

mysql> SHOW TABLES FROM information_schema;
+---------------------------------------+
| Tables_in_information_schema          |
+---------------------------------------+
| CHARACTER_SETS                        |
| CHECK_CONSTRAINTS                     |
| COLLATIONS                            |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLUMNS                               |
| COLUMN_PRIVILEGES                     |
| COLUMN_STATISTICS                     |
| ENGINES                               |
| EVENTS                                |
| FILES                                 | 
(中略)
| TRIGGERS                              |
| USER_PRIVILEGES                       |
| VIEWS                                 |
| VIEW_ROUTINE_USAGE                    |
| VIEW_TABLE_USAGE                      |
+---------------------------------------+
67 rows in set (0.03 sec)

mysql> \q
Bye
# exit

では、ブラウザで、phpMyAdmin表示確認してみましょう。

http://localhost:8080

phpMyAdmin画面を表示しますが、何やら mysqlに接続できません。こんなエラーが表示されます。

mysqli_real_connect(): The server requested authentication method unknown to the client [caching_sha2_password]
mysqli_real_connect(): (HY000/2054): The server requested authentication method unknown to the client

mysqlモニターで接続できないんだから、そりゃそうだ。

対策その1 – mysqlを再ビルド

まずは一旦 docker-composeを停止

$ docker-compose stop
Stopping laradocklaratuto_nginx_1 ... done
Stopping laradocklaratuto_php-fpm_1 ... done
Stopping laradocklaratuto_workspace_1 ... done
Stopping laradocklaratuto_phpmyadmin_1 ... done
Stopping laradocklaratuto_docker-in-docker_1 ... done
Stopping laradocklaratuto_mysql_1 ... done

docker-compose の状況確認

docker-compose ps
               Name                              Command                State     Ports
---------------------------------------------------------------------------------------
laradocklaratuto_docker-in-docker_1   dockerd-entrypoint.sh            Exit 0          
laradocklaratuto_mysql_1              docker-entrypoint.sh mysqld      Exit 0          
laradocklaratuto_nginx_1              /bin/bash /opt/startup.sh        Exit 137        
laradocklaratuto_php-fpm_1            docker-php-entrypoint php-fpm    Exit 0          
laradocklaratuto_phpmyadmin_1         /docker-entrypoint.sh apac ...   Exit 0          
laradocklaratuto_workspace_1          /sbin/my_init                    Exit 0

ということで、mysql を再ビルド

$ docker-compose build mysql
Building mysql
Step 1/9 : ARG MYSQL_VERSION=latest
Step 2/9 : FROM mysql:${MYSQL_VERSION}
 ---> 62a9f311b99c
Step 3/9 : LABEL maintainer="Mahmoud Zalt <mahmoud@zalt.me>"
 ---> Using cache
 ---> 5058417d301b
Step 4/9 : ARG TZ=UTC
 ---> Using cache
 ---> 8ebb90e16795
Step 5/9 : ENV TZ ${TZ}
 ---> Using cache
 ---> 95f61388e8ed
Step 6/9 : RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && chown -R mysql:root /var/lib/mysql/
 ---> Using cache
 ---> aa0dfc41ec7d
Step 7/9 : COPY my.cnf /etc/mysql/conf.d/my.cnf
 ---> Using cache
 ---> dab3a71488b5
Step 8/9 : CMD ["mysqld"]
 ---> Using cache
 ---> 101902f85ce6
Step 9/9 : EXPOSE 3306
 ---> Using cache
 ---> 92e28e715cea
Successfully built 92e28e715cea
Successfully tagged laradocklaratuto_mysql:latest

なんかキャッシュが効いている感じですけど……とりあえず、docker-compose を再起動します。

$ docker-compose up -d nginx mysql phpmyadmin
Starting laradocklaratuto_docker-in-docker_1 ... 
Starting laradocklaratuto_docker-in-docker_1
Starting laradocklaratuto_mysql_1 ... 
Starting laradocklaratuto_docker-in-docker_1 ... done
Starting laradocklaratuto_workspace_1 ... 
Starting laradocklaratuto_mysql_1 ... done
Starting laradocklaratuto_phpmyadmin_1 ... 
Starting laradocklaratuto_workspace_1 ... done
Starting laradocklaratuto_php-fpm_1 ... 
Starting laradocklaratuto_php-fpm_1 ... done
Starting laradocklaratuto_nginx_1 ... 
Starting laradocklaratuto_nginx_1 ... done

mysqlコンテナに接続し、mysqlモニターに入りまして〜

$ docker-compose exec mysql bash
# mysql -u default -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.17 MySQL Community Server - GPL
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

DB確認 – OK!

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| default            |
| information_schema |
+--------------------+
2 rows in set (0.03 sec)

defaultテーブルが見られない、またシンタックスエラー!

mysql> SHOW TABLES FROM default;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'default' at line 1
mysql> \q
Bye
# exit

キャッシュが効いた状態だったのが、あかんかったんですかね〜?

次に進みましょう!

対策2 – キャッシュを使わずに mysql を再ビルド

mysql を –no-cache でリビルドすればええねんな〜!

ちゅーことで、docker-compose を停止

$ docker-compose stop
Stopping laradocklaratuto_nginx_1            ... done
Stopping laradocklaratuto_php-fpm_1          ... done
Stopping laradocklaratuto_workspace_1        ... done
Stopping laradocklaratuto_phpmyadmin_1       ... done
Stopping laradocklaratuto_docker-in-docker_1 ... done
Stopping laradocklaratuto_mysql_1            ... done

–no-cacheでビルド

$ docker-compose build --no-cache mysql
Building mysql
Step 1/9 : ARG MYSQL_VERSION=latest
Step 2/9 : FROM mysql:${MYSQL_VERSION}
 ---> 62a9f311b99c
Step 3/9 : LABEL maintainer="Mahmoud Zalt <mahmoud@zalt.me>"
 ---> Running in 71a61e56788b
Removing intermediate container 71a61e56788b
 ---> 40aecf17e159
Step 4/9 : ARG TZ=UTC
 ---> Running in 964d476c105f
Removing intermediate container 964d476c105f
 ---> e6717c7e9850
Step 5/9 : ENV TZ ${TZ}
 ---> Running in 029696b05e93
Removing intermediate container 029696b05e93
 ---> 23645640fdf8
Step 6/9 : RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && chown -R mysql:root /var/lib/mysql/
 ---> Running in f6a9e640a719
Removing intermediate container f6a9e640a719
 ---> 84372d2738b3
Step 7/9 : COPY my.cnf /etc/mysql/conf.d/my.cnf
 ---> a3271c2f9b4d
Step 8/9 : CMD ["mysqld"]
 ---> Running in cd3ba1d7e53f
Removing intermediate container cd3ba1d7e53f
 ---> 2fe7ca3c4f0d
Step 9/9 : EXPOSE 3306
 ---> Running in 790c9197039d
Removing intermediate container 790c9197039d
 ---> 2fdb99b2b437
Successfully built 2fdb99b2b437
Successfully tagged laradocklaratuto_mysql:latest

キャッシュを使わずリビルドできたようです。

ということで、先程と同じことを行いました。(途中省略して、mysqlモニターのみ)

mysql> SHOW TABLES FROM default;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'default' at line 1
mysql> \q
Bye
# exit               

いつもいつも、シンタックス・エラーって何やねん!綴りはあってんで〜!

それにしても開発環境を構築できないとは……。

もしかしてノートパソコンの充電が切れてたから、何かファイルが壊れたかな?

mysql リムーブ

mysqlだけ、入れ直すということを決め、コンテナとイメージを削除しました。ターミナル履歴のコピーを取り忘れたので、コマンドだけ記述します。

mysql コンテナ削除

$ docker rm e802567fac63

mysql イメージ削除

$ docker rmi 2fdb99b2b437D

ということで、本日は時間となりました。

まとめ

なかなか思い通りには行きませんが、仕事に直接関係無いこともあり、余裕をもってあれこれ試せるのは良いですね。

今回の参加者は、Nさん、Mさん、初参加のWさん、そして私でした。

今回の参考サイト

初心者がLaradockでLaravelを開発するための準備の仕方をまとめるよ | 東京上野のWeb制作会社LIG
https://liginc.co.jp/465420

テーブルの一覧を表示する – MySQL 逆引きリファレンス
http://mysql.javarou.com/dat/000393.html

データベースの一覧を表示する – MySQL 逆引きリファレンス
http://mysql.javarou.com/dat/000418.html

mysqlコマンド関連:MySQL 逆引きリファレンス
http://mysql.javarou.com/category/173.html

コマンドラインから MySQL に接続する – MySQL 逆引きリファレンス
http://mysql.javarou.com/dat/000389.html

【Docker】MySQL8.0系を使う時に発生する問題について – websandbag ブログ
https://blog.websandbag.com/entry/2018/05/17/121730

docker-compose コマンドまとめ – Qiita
https://qiita.com/wasanx25/items/d47caf37b79e855af95f#rm

初心者向けdocker-composeコマンド逆引き – Qiita
https://qiita.com/okyk/items/a374ddb3f853d1688820

docker-compose up vs docker-compose up –build vs docker-compose build –no-cache – Stack Overflow
https://stackoverflow.com/questions/39988844/docker-compose-up-vs-docker-compose-up-build-vs-docker-compose-build-no-cach/39988980

docker-composeでbuildする時にcacheを使わない – Qiita
https://qiita.com/setouchi/items/e01557ae4647b8e3b1bc

docker-composeでbuildする時にcacheを使わない – 塩焼きブログ
https://sioyaki.com/entry/2016/06/16/095357

LaradockのMySQLに接続できなくてはまった話 – Qiita
https://qiita.com/dnrsm/items/4bd078c17bb0d6888647

【2019年2月】Laradockの初期環境設定方法 – Qiita
https://qiita.com/don-bu-rakko/items/0297280553e99aa6d7b8

Dockerイメージとコンテナの削除方法 – Qiita
https://qiita.com/tifa2chan/items/e9aa408244687a63a0ae

あとがき

帰りの車の中で、今回の沼にはまった原因を考えていた時、システムの破損によるシンタックスエラーというよりは、mysqlのバージョン指定 or セキュリティ設定に問題があるのではないかと思い当たりました。

mysqlはバージョン 8.0だとセキュリティが厳しいので、設定にひと工夫が必要みたいです。

改めて、今回の環境構築の参考サイトを見てみると、mysqlのバージョンを 5.7に指定して環境構築していました orz。

8.0で突っ張るか、5.7に日和るか……ちょっと悩みます。勉強のためには 8.0が良いんでしょうけど。

私の息子も Laradock での環境構築を行っています。私より後に始めたのに、すでにアプリを作り始めています。遥かに先に……。