コマンドまとめ
// dockerコンテナのリスト
$ docker container ls
// dockerコンテナに接続
$ docker exec -it mysql-container bash
(mysql-containerはコンテナ名)
// dockerコンテナ内に接続
# mysql -u root -p
// TCP/IP接続でmysqlに接続
# mysql -u myusername -h 127.0.0.1 -p
// dockerネットワークの一覧
$ docker network ls
mysql_defaultがあるのを確認
// mysql_defaultのネットワーク・ブリッジを取得
$ docker network inspect mysql_default
環境
- Mac macOS Monterey
経緯
もともとHomebrewで昔にMySQLをインストールしていたけど、パスワード忘れたり、何入れてたか忘れた。
- MySQLに接続できない
- 再構築にもいろいろ手間取った
- パスワードのポリシー変更
- 構文エラー?(5系と8系の違いですかね?)
このあたりもじっくり調べたいところではありますが、やりたいことはそこではないので、、、
他にも学習用に簡単に作って壊してができるDockerが良いかと思い、調べました。
手順
以下のサイトを参考にしました。
下記手順でそのまま行けると思います。
- Docker Desktopのインストール
- MySQLの構築
- DBeaverのダウンロード(クライアントツール)
- ターミナルからDockerの中のMySQLに接続
注意
ターミナルからDockerの中のMySQLに接続
ターミナルからは
// これはダメ
mysql -u root -p
// これはOK。
// TCP/IP接続するにはlocalhostではなく127.0.0.1とする必要あり。
mysql -h 127.0.0.1 -u root -p
// これでもOK
// localhostでも、--protocol=TCP オプションを使用してトランスポートプロトコルを明示的に指定することも可。
mysql -h localhost --protocol=TCP -u root -p
-h
はホスト名を指定するオプション。リモートサーバに接続するときに使うやつ。
127.0.0.1
はホストを指定。今回は自分自身。
参考
https://dev.mysql.com/doc/refman/8.0/ja/connecting.html
Laravelから接続する
TCPの設定を書かないといけないのかなと思ったのですが、必要ありませんでした。
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=mydatabase
DB_USERNAME=myusername // あらかじめmysqlに接続して作成しておく
DB_PASSWORD=mypassword // あらかじめmysqlに接続して作成しておく
php artisan migrate
// 下記のようなエラーが出る。
SQLSTATE[HY000] [1045] Access denied for user 'myusername'@'172.18.0.1'
127.0.0.1
じゃなく、172.18.0.1
になっています。
どうやらLaravelからアクセスすると、ホストは172.18.0.1のようですので、あらためてmysqlで
'myusername'@'172.18.0.1'のユーザーを登録します。
20221230追記(127.18.0.1の正体)
参考:https://qiita.com/johejo/items/83cb83a885b8ac996ec9
ネットワークの知識が乏しく、ちゃんと理解してはいませんが、調べ方がわかりました。
ホスト側のターミナル上で、
$ docker network inspect mysql_default | grep -i gateway
を実行する以下のようにGatewayのIPアドレスが取得できます。
"Gateway": "172.18.0.1"
ホスト側のアプリからアクセスする場合、このIPアドレスがホストになるようです。
なので、
// ホストのIPアドレスを調べる
$ docker network inspec mysql_default | grep -i gateway
"Gateway": "172.18.0.1" // (例)
// コンテナ内のMySQLに接続し、"172.18.0.1"をホストとするユーザーを追加
$ docker exec -it mysql-container bash // コンテナに接続
# mysql -u root -p // MySQLに接続
mysql > CREATE USER 'myusername'@'172.18.0.1' IDENTIFIED BY 'secret'; // ユーザーを追加
これでホストのLaravelからDockerコンテナ内のMySQLに接続する設定ができる流れになります。
いまいち理解していないことは、
Laravelの.envの
DB_HOST=127.0.0.1
はそのままでいいの???
ってことです。
Dockerは同じマシンに入っているから127.0.0.1になるのはいいのかな??
このあたりはネットワークの知識ですかね。ちょっと勉強しないとわからないです、現状。(わかる方教えてください!!)
また明確になり次第更新します。
そうするとマイグレーションが実行できるようになります。
ちなみに、
DB_HOST=127.0.0.1
: うまくいく
DB_HOST=localhost
: エラーが発生する
なんで??
どうやら接続方法が違うということですかね。
ターミナルからmysqlに接続する際、127.0.0.1ならうまくいって、localhostならTCPの接続方法をオプションで指定する必要がありました。
なので、
127.0.0.1 -> TCP/IP
localhost -> ソケット
ということらしい。
一般的に、というか、mysqlの接続方法が、デフォルトではホストを指定しない場合、
- localhostをホスト名に使用
- ソケット通信
という使用のため、上記のような違いが出てくるようです。