MySQLのコンテナを立ち上げる
まずはワンライナーでMySQLのバージョン8.0.14
を指定してコンテナを立ち上げるましょう。
ポートはlocalのポート番号と被らないように4306を指定します。
-> % docker run --name test_mysql -v ~/docker/mysql/conf:/etc/mysql/conf.d -v mysql-datavolume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_USER=root -e MYSQL_DATABASE=test -p 4306:3306 mysql:8.0.14 --default-authentication-plugin=mysql_native_password
上記のコマンドでコンテナを立ち上げると、次のようなログが出ます。
-> % docker run --name test_mysql -v ~/docker/mysql/conf:/etc/mysql/conf.d -v mysql-datavolume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_USER=root -e MYSQL_DATABASE=test -p 4306:3306 mysql:8.0.14 --default-authentication-plugin=mysql_native_password
2019-04-07T13:51:01.809469Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2019-04-07T13:51:01.809585Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.14) starting as process 1
2019-04-07T13:51:02.177844Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2019-04-07T13:51:02.179883Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
2019-04-07T13:51:02.202748Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.14' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
2019-04-07T13:51:02.337543Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/var/run/mysqld/mysqlx.sock' bind-address: '::' port: 33060
2019-04-07T13:52:30.702558Z 8 [Warning] [MY-010055] [Server] IP address '172.17.0.1' could not be resolved: Name or service not known
このログの中で重要なのが、[Server] /usr/sbin/mysqld: ready for connections.
の部分です。
このログが出ていれば、問題なくMySQL8.0.14でコンテナが立ち上がっている証拠。
接続の確認
コンテナが立ち上がっていても、実際に接続できていないと意味がないですよね。
- docker
- ローカル
- Sequel Pro
のそれぞれで接続できるかどうか、試してみましょう。
dockerで接続してみる
exec
コマンドを使って、先程作成したtest_mysqlというコンテナの中に入ってみましょう。
-> % docker exec -it test_mysql bash
次のような表示が出れば、接続成功です。
root@cf28f18b8a08:/#
続いて、コンテナ作成時に設定した環境変数がキチンと反映されているかどうか、確認してみます。
root@cf28f18b8a08:/# printenv
HOSTNAME=cf28f18b8a08
MYSQL_DATABASE=test
MYSQL_ROOT_PASSWORD=root
PWD=/
HOME=/root
MYSQL_MAJOR=8.0
GOSU_VERSION=1.7
MYSQL_USER=root
MYSQL_VERSION=8.0.14-1debian9
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/printenv
ちゃんと読み込まれていますね。
では、コンテナ内でMySQLに接続してみましょう。
root@cf28f18b8a08:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
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>
無事に接続が確認できましたね。問題なさそうです。
ローカルから接続してみる
続いて、ローカルのMySQLからコンテナ内のMySQLに繋いでみましょう。
-> % mysql -uroot -p -h 127.0.0.1 --port 4306
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
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> exit
Bye
こちらも問題なさそうですね。
Sequel Proから接続してみる
最後にこの記事のメインであるMySQLのGUIクライアント、Sequel Proで接続してみましょう。
現在の状態で接続すると、次のようなエラーが出ます。
ログコピペ用
MySQL said: Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/mysql/lib/plugin/caching_sha2_password.so, 2): image not found
これはMySQL8.0系で変わったパスワードの認証方法が変更されたことが原因。
エラーを解消するためには、rootユーザーのプラグインをmysql_native_password
に変更する必要があります。
まずは、ローカルかdockerコンテナ内でmysqlに接続してください。
続いて、現在の設定状況を確認します。
mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| 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 |
+------------------+-----------+-----------------------+
5 rows in set (0.01 sec)
すると、すべてのプラグインがcaching_sha2_password
で設定されていることがわかります。
とりあえず、接続を確認するため、rootユーザーのプラグインをmysql_native_password
に変更します。
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
Query OK, 0 rows affected (0.01 sec)
コマンドに成功したので、もう一度設定状態を確認します。
mysql> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| root | % | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.01 sec)
rootユーザーのプラグイン設定が変更されているのがわかりますね。
ログアウトして、もう一度Sequel Proで接続してみましょう。
接続できましたね。
以上で解説は終わりです。お疲れ様でした!