1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DockerでMySQL構築&ホストのLaravelから接続

Last updated at Posted at 2022-12-13

コマンドまとめ

// 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の中の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の設定を書かないといけないのかなと思ったのですが、必要ありませんでした。

.env
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をホスト名に使用
  • ソケット通信

という使用のため、上記のような違いが出てくるようです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?