見出し画像

LaravelからDockerを使ってMySQLへ接続確認する方法

MySQLへの接続で躓いたので、確認したポイントをメモに残しておきます。

はじめに

DockerコンテナにLaravelは追加済みで、Hello World済みのところから、MySQLへの接続ができるように設定していきます。

スクリーンショット 2019-12-30 16.00.36

各ファイルを用意

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 です。

スクリーンショット 2019-12-30 16.13.00

Connectボタンを押してこの画面になったら接続OKです!

スクリーンショット 2019-12-30 16.17.43

詰まったとき確認するポイント

Sequel ProでAccess denied!になってしまい、どう原因調査すればよいか分からなかった

スクリーンショット 2019-12-30 16.23.25

①まずdocker-compose psする

docker-composeの状態を確認します

スクリーンショット 2019-12-30 16.27.03

・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となっているので起動してそう。

スクリーンショット 2019-12-30 15.39.02

次に接続確認。-uroot -p は、rootパスワードを設定した場合です。先ほど.envファイルで設定したパスワードを入力すると、接続が確認できました!(パスワードを設定していてない場合は、mysql -urootでOK)

スクリーンショット 2019-12-30 15.43.42

これで原因は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

スクリーンショット 2019-12-30 16.46.23

これで、無事に接続することができました!🎉



スキ頂けると嬉しいです〜