Dockerで起動したMySQLコンテナへの接続にハマる
はじめに
docker-composeでMySQLのコンテナを起動し、接続しようとした際にハマり、
中々抜けられなかったので備忘録として残します。
※開発環境は「LEMP」です。
docker-composer.yml
最終的な docker-composer.yml は以下です。
version: "3.9"
services:
db:
build: ./mysql
ports:
- "4306:3306"
volumes:
- db-store:/var/lib/mysql
environment:
MYSQL_DATABASE: database
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: password
TZ: "Asia/Tokyo"
volumes:
db-store:
ハマった箇所
Sequel ProでMySQLへの接続に失敗する
Sequel ProでMySQLへ接続すると、以下のエラーが発生しました。
Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
MySQL8.0からデフォルトのログイン認証方式にcaching_sha2_password
が採用されており、
Sequel Proでは、この認証方式がサポートされていなかったため発生します。
この問題は、後継アプリの「Sequel Ace」を使用することで解決できます。
補足
デフォルトの認証方式は以下の「command」を追記することで変更できます。
ただ、Sequel Proは既に開発が止まっており、MySQL8.0にも対応していないようなので
基本的に「Sequel Ace」を使用するべきだと思います。
db:
build: ./mysql
command: --default-authentication-plugin=mysql_native_password // 追記
ports:
- "3306:3306"
Sequel AceでMySQLへの接続に失敗する
docker-composer.ymlにホスト側のポート番号を"3306:3306"
と、
3306 に設定、かつローカルでMySQLを使用している場合、
ポート番号がバッティングする可能性が高いため、接続に失敗することが多いです。
この場合、ホスト側のポート番号を"4306:3306"
のように
4306 に変更し、以下を実行すると反映され、この問題は解決できます。
docker-compose stop
docker-compose up -d
※念の為コンテナを一度停止する
ボリュームが原因でMySQLへ接続できない
名前付きボリューム(db-store)を定義して永続化すると、
文字コードの変更やMySQLバージョンの変更後の接続時に、
以下のエラーが発生することがあります。
Access denied for user 'user'@'172.19.0.1' (using password: YES)
その場合は以下実行すると、--volumes
オプションにより
コンテナと名前付きボリュームの削除が行え、
up
コマンドでコンテナを再度作成すれば、初期化されたMySQLを扱えます。
$ docker-compose down --volumes
$ docker-compose up -d --build
※名前付きボリュームは、コンテナを停止や削除してもその中のデータは消えず、
データを永続化できるため使用
参考
Discussion