DockerでMySQL8.0の環境構築 & 認証方式変更

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.ymlMYSQL_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でログインを試してみます。

596-mysql-8-with-docker_sequel-1.png

ホスト上のコマンドラインツールで指定したオプションを同様に指定します。

596-mysql-8-with-docker_sequel-2.png

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でログインしてみます。

596-mysql-8-with-docker_sequel-3.png

接続自体はできたのですが、エラーが発生しました。

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 を利用してみます。

596-mysql-8-with-docker_sequel5.png

今まで利用していたSequelProをリネームして、NightlyバージョンのSequelProをインストールしました。

Nightlyバージョンは色が灰色です。

596-mysql-8-with-docker_sequel4.png

NightlyバージョンのSequelProではエラーが発生せず、DBの情報を確認できました。

参考