LaravelからDockerを使ってMySQLへ接続確認する方法
MySQLへの接続で躓いたので、確認したポイントをメモに残しておきます。
はじめに
DockerコンテナにLaravelは追加済みで、Hello World済みのところから、MySQLへの接続ができるように設定していきます。
各ファイルを用意
docker-compose.ymlにmysqlを追加
services:
mysql:
build: ./mysql
container_name: '${PROJECT}-mysql'
tty: true
environment:
MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
MYSQL_DATABASE: "${PROJECT}"
MYSQL_USER: "${MYSQL_USER}"
MYSQL_PASSWORD: "${MYSQL_PASSWORD}"
BIND-ADDRESS: "0.0.0.0"
TZ: 'Asia/Tokyo'
volumes:
- "./mysql/data:/var/lib/mysql"
- "./mysql/conf_d:/etc/mysql/conf.d"
- "./mysql/mysql_init:/docker-entrypoint-initdb.d"
ports:
- "3306:3306
上記のvolumesの./mysql/data:/の設定により、dataディレクトリ配下にデータが入るようになっています。(これはDockerコンテナを作り直してもデータが消えないようにらしいです)
ここにある環境変数はdocker/.envで設定しています
PROJECT=todo-list
MYSQL_ROOT_PASSWORD=secret
MYSQL_USER=docker
MYSQL_PASSWORD=secret
次にdocker/mysql/Dockerfileと、my.cnfファイルを用意します
mysql/conf_d/my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
explicit_defaults_for_timestamp = true
[client]
default-character-set=utf8mb4
mysql/Dockerfile
FROM mysql:5.7
# 地域言語設定
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
## ENV LC_ALL ja_JP
ENV TZ JST-9
## 特定のパッケージインストール時に地域を聞かれないようにする
ENV DEBIAN_FRONTEND=noninteractive
## apt の更新
RUN apt -y update
これで設定はOKなはず!
$ docker-compose up -d
今回、GUIツールは下記の記事を参考にSequel Proを使ってみました
ダウンロードしたらTCP/IP接続します。
Passwordは先ほど.envファイルで設定した secret です。
Connectボタンを押してこの画面になったら接続OKです!
詰まったとき確認するポイント
Sequel ProでAccess denied!になってしまい、どう原因調査すればよいか分からなかった
①まずdocker-compose psする
docker-composeの状態を確認します
・stateがUpになっているか
・Portsの設定が正しくされているか
・他でPortsが使われていないか
このあたりをチェックしました。
ポート番号は先ほど追記したdocker-compose.ymlのportsと番号が合っているはずです。
mysql:
ports:
- "3306:3306"
②DBデータを削除し、dockerコンテナを再ビルド
コンテナを作成後、envファイルを修正してしまった場合、DB情報を再作成する必要があります。
envファイルのユーザーIDやパスワードを元にDB情報を作成してしまっているためです。
コンテナを停止、削除後、一度、mysql/data を削除した後に再度コンテナをビルドして起動します。
コンテナのビルド時に自動でDBを再作成します。
※mysql/data の情報が作成されます。
$ docker-compose stop
$ docker-compose rm
$ mysql/data の中身を削除
$ docker-compose up -d
③Dockerコンテナの中に入ってmysqlが起動しているか確認
bashでコンテナの中に入る
$ docker exec -it [container_name] bash
statusコマンドで起動しているか確認しました。runningとなっているので起動してそう。
次に接続確認。-uroot -p は、rootパスワードを設定した場合です。先ほど.envファイルで設定したパスワードを入力すると、接続が確認できました!(パスワードを設定していてない場合は、mysql -urootでOK)
これで原因はMySQLではなく、Sequel Proとの接続部分かなと見当がつきました。
最後の確認
MySQLの接続ができているので、なぜAccess deniedとなるのか・・😕と思っていたら、Sequel ProのUser nameとDatabase nameを逆に入力していました。
envファイルで設定したMYSQL_USERがUsernameとなります。
PROJECT=todo-list
MYSQL_ROOT_PASSWORD=secret
MYSQL_USER=docker
MYSQL_PASSWORD=secret
これで、無事に接続することができました!🎉
スキ頂けると嬉しいです〜