はじめに
Ruby や php のフレームワークで DB を操作する場合、フレームワークが用意してくれてる OR マッパーを使ってあまり ホストで動かす DB クライアントは使わないのです。
しかし、たまに 複雑すぎて生 SQL を書きたい場合(集計期間が商品ごとに異なるが、商品単位で一括で表示したい)があります。
この場合、クライアント使って試した方が効率的です。MySQL のコンテナに入って直打ちもできますが、長い SQL の一部だけ修正とか結構つらいからです。
問題
localhost だとホストマシンのを優先で見に行く
MySQL では デフォルトでは ポート 3306 を見に行くので、 Docker コンテナではなく、ホストマシンの 3306 につなぎに行って接続に失敗します。
対応
2つの方法があるのでお好みで対応してください。
方法1 WSL2 の IP アドレスを使う
構成に手を加えずに頑張る方法です。デメリットとしては固定 IP 出ない場合、可変であるため、毎回 IP の探索して設定を更新しないといけません。
WSL2 の IP 確認方法
Ubuntu の 場合、ifconfig というコマンドで確認できます。たくさん表示されますが eth0 の値を使用します。ifconfig コマンドの出力例を図1に示します。
上記で確認した IP アドレスを使用すれば MySQL に接続できます。
方法2 MySQL コンテナのポート番号を変える
ポート番号がかぶっている問題を解決する方法です。デメリットとしてはチーム全体に影響を与えることです。
ポート番号の変更
docker compose を使用している場合
ポート番号を 13306 にする場合の docker compose の設定を以下に示します。
version: "3"
services:
mysql:
image: mysql:5.7
ports:
- 13306:3306
docker で動かしている場合
ポート番号を 13306 にする場合の コマンドを以下に示します。ポート番号を変えれば localhost で接続できます
docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 13306:3306 -d mysql:5.7
おわりに
可能であれば方法2の方がうれしいので、他メンバーがいる場合は頑張って説得しましょう。
また、 WSL2 + Docker compose + MySQL では意外とハマることがあります。起動しないとかのケースは以下を参照してみてください
コメント