Dockerで MySQL8.0
の環境を構築する方法について紹介します。Sequel Pro
を利用する際にいくつか気をつけるポイントがあったので、その対処方法も合わせて紹介します。
コンテナ起動
docker-compose.ymlの設定
以下の docker-compose.yml
をもとにコンテナを作成します。
version: '3'
services:
db:
image: mysql:8.0.14
restart: always
ports:
- "13306:3306"
volumes:
- ./.data/db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: test
MYSQL_PASSWORD: test
環境変数は MYSQL_ROOT_PASSWORD
のみ必須です。詳しくは、https://hub.docker.com/_/mysql/ で確認できます。
コンテナ起動
コンテナを起動します。
$ docker-compose up -d
Creating network "mysql8_default" with the default driver
Pulling db (mysql:8.0.14)...
8.0.14: Pulling from library/mysql
(省略)
Creating mysql8_db_1 ... done
$
$
$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------------
mysql8_db_1 docker-entrypoint.sh mysqld Up 0.0.0.0:13306->3306/tcp, 33060/tcp
MySQLサーバーにログイン
コマンドラインツールでログイン
( コンテナ上で実施 )
まずコンテナに接続します。
$ docker exec -it mysql8_db_1 bash
MySQLのバージョンを確認してみます。
root@48f02828b3cc:/# mysql --version
mysql Ver 8.0.14 for Linux on x86_64 (MySQL Community Server - GPL)
MySQLサーバーにログインしてみます。
root@48f02828b3cc:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 8.0.14 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>
パスワードは、docker-compose.yml
の MYSQL_ROOT_PASSWORD
で設定した値です。
無事ログインできました。
コマンドラインツールでログイン
( ホスト上で実施 )
今度は、Macにインストール済みのmysqlクライアントでMySQLサーバーにログインしてみます。
こちらのmysqlクライアントもバージョン8を利用しています。
$ mysql --version
mysql Ver 8.0.12 for osx10.14 on x86_64 (Homebrew)
docker-compose.yml
で設定したポートを指定してログインします。
$ mysql -uroot -p -h 127.0.0.1 --port 13306
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 23
Server version: 8.0.14 MySQL Community Server - GPL
Copyright (c) 2000, 2018, 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>
無事ログインできました。
Sequel Proでログイン
( ホスト上で実施 )
最後にSequel Proでログインを試してみます。
ホスト上のコマンドラインツールで指定したオプションを同様に指定します。
Sequel Proだとログインできませでした。
「MySQL said: Authentication plugin ‘caching_sha2_password’ cannot be loaded」というメッセージが表示されています。
MySQL8.0の認証方式
デフォルト認証方式
MySQL8.0からログイン認証方式に caching_sha2_password
が採用されています。キャッシュを利用することにより、パフォーマンス面で今までの認証方式よりも優れています。
Sequel ProでログインできなかったのはSequel Pro側で caching_sha2_password
がサポートされていなかったためです。ログイン認証するには、クライアントとサーバーで同じ認証形式がサポートされている必要があります。
認証方式の確認方法
ユーザーごとの認証方式は以下クエリで確認できます。
mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| root | % | caching_sha2_password |
| test | % | 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)
認証方式の変更(既存ユーザー)
ALTER USER
で既存ユーザーの認証方式を変更してみます。
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'new_root_password';
Query OK, 0 rows affected (0.01 sec)
従来の mysql_native_password
に変更することができました。
mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| root | % | mysql_native_password |
| test | % | 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.01 sec)
認証方式の変更(新規ユーザー)
新規ユーザーを作成するときの認証方式を mysql_native_password
にしたい場合、/etc/my.cnf
に以下内容を追記します。
[mysqld]
default-authentication-plugin = mysql_native_password
docker-compose
を利用する場合、command: --default-authentication-plugin=mysql_native_password
を追記します。
version: '3'
services:
db:
image: mysql:8.0.14
command: --default-authentication-plugin=mysql_native_password
restart: always
ports:
- "13306:3306"
volumes:
- ./.data/db:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: test
MYSQL_PASSWORD: test
動作確認するため、一度コンテナを削除します。
$ docker-compose stop
Stopping mysql8_db_1 ... done
$
$ docker-compose rm
Going to remove mysql8_db_1
Are you sure? [yN] y
Removing mysql8_db_1 ... done
検証用のDBなので、永続データも削除してしまいます。
$ rm -fr .data/
再度コンテナを立ち上げます。
$ docker-compose up -d
Starting mysql8_db_1 ... done
MySQLサーバーにログインしてユーザー情報を確認してみます。
mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| root | % | mysql_native_password |
| test | % | 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 |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)
Dockerコンテナ生成時に作成されたユーザーの認証方式が mysql_native_password
となっていることを確認できました。
再度Sequel Proでログイン
まだ利用できない
ユーザーの認証方式を mysql_native_password
に変更したので、再度Sequel Proでログインしてみます。
接続自体はできたのですが、エラーが発生しました。
sequel-pro-nightlyを利用
SequelProのリポジトリにて、下記Issueが作成されていました。
Need MySQL 8.0 support #2699
このIssue内で、sequel-pro-nightly
を利用した解決方法が書かれていました。https://github.com/sequelpro/sequelpro/issues/2699#issuecomment-421767625
リンク先の指示通り、sequel-pro-nightly
を利用してみます。
今まで利用していたSequelProをリネームして、NightlyバージョンのSequelProをインストールしました。
Nightlyバージョンは色が灰色です。
NightlyバージョンのSequelProではエラーが発生せず、DBの情報を確認できました。