🙌

Dockerで起動したMySQLコンテナへの接続にハマる

2023/09/11に公開

はじめに

docker-composeでMySQLのコンテナを起動し、接続しようとした際にハマり、
中々抜けられなかったので備忘録として残します。
※開発環境は「LEMP」です。

docker-composer.yml

最終的な 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

※名前付きボリュームは、コンテナを停止や削除してもその中のデータは消えず、
データを永続化できるため使用

参考

https://qiita.com/ucan-lab/items/b094dbfc12ac1cbee8cb
https://qiita.com/ucan-lab/items/b1304eee2157dbef7774

Discussion