LaradockでMySQLに接続したい!!
Laradockでlaravelの開発環境を構築する方法については、公式ドキュメントや多くのQiitaの記事で説明されており、基本的にはそれに従って行けば開発環境を立ち上げることができると思います。しかし、自分が公式ドキュメントや記事通りに作業していく中でハマった点が2つあり、その解決法を探すのに時間がかかったので、ハマった点とその対処法について記録を残しておくものです
ハマった点
1 MySQLのバージョンについて
MySQLの認証方法がLaravelにサポートされてないのでエラーが出る。
MySQL 8.0.4からデフォルトの認証方式が変わり、セキュリティが強化されました。しかし、Laravel側でサポートされていないためphp artisan migrateを打っても「The server requested authentication method unknown to the client」というエラーが出ます
2 .envの編集について
Laradock,Laravelの.envの編集すれば良いか、MySQLのユーザー登録をどのようにすれば良いかがわからない
1 Laradockのインストール、env編集
今回はこのようなディレクトリ構造で作業を行なっていきます
- (root)
- sampleapp
- Laradock(Laradock側)
- Laravel
- wikiLearns(Laravel側)
- sampleapp
まずは公式ドキュメント通り
$ git clone https://github.com/laradock/laradock.git
$ cd laradock
$ cp env-example .env
ここで.envファイルを編集します
### MYSQL ################################################
MYSQL_VERSION=5.7 //latest
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d
MySQLのバージョンをlatestから5.7にしました
なのでハマった点1の答えは「認証方法変更前のMySQL5.7を使おう」です。現在インストールしているMySQLも8.0.4 -> 5.7に変更しました
それともう一つ
### NGINX ################################################
NGINX_HOST_HTTP_PORT=8888 // 80
NGINX_HOST_HTTPS_PORT=443
NGINX_HOST_LOG_PATH=./logs/nginx/
NGINX_SITES_PATH=./nginx/sites/
NGINX_PHP_UPSTREAM_CONTAINER=php-fpm
NGINX_PHP_UPSTREAM_PORT=9000
NGINX_SSL_PATH=./nginx/ssl/
NGINXのポート番号を80 -> 8888に変更しました
Apacheのポート番号とダブらないようにするためです
2 コンテナの起動
コンテナを起動します
docker-compose up -d nginx mysql phpmyadmin
ここで8.0 -> 5.7にバージョンを変えた場合、MySQLのコンテナだけ起動されないという不具合が発生します。その時はDATA_PATH_HOSTで設定したフォルダを綺麗にして、イメージを作成し直す必要があります
対処法
① パス確認
$ cat .env | grep DATA_PATH_HOST
自分の場合は DATA_PATH_HOST=~/.laradock/data が表示されました
② パス、イメージ、コンテナを消去
rm -rf ~/.laradock/data/mysql
docker rmi laradock_mysql -f
docker rmi mysql -f
③ mysqlをビルドし直し
docker-compose build --no-cache mysql
④ docker ps でちゃんと動いているか確認しましょう
3 Laravelプロジェクトの作成
workspaceに入って
$ docker exec -it laradock_workspace_1 bash
Laravelプロジェクトの作成
生成後、sampleapp/Laravel/wikiLearns 内にディレクトリwikiLearnsが出来るので、これをsample/Laravelに置き直してください(何かここ方法があるはず)
# composer create-project laravel/laravel wikiLearns(任意のアプリ名)
workspaceから出ます
# exit
設定の変更をするために一時停止
$ docker-compose stop
APP_CODE_PATH_HOST=../をAPP_CODE_PATH_HOST=../laravel/wikiLearns(自分の作ったディレクトリに対するLaradock起点での任意のパス)に書き換えてください
APP_CODE_PATH_HOST=../laravel/wikiLearns // ../
コンテナ再起動
$ docker-compose up -d nginx mysql
ブラウザでhttp://localhost:8888/ につなぐと例の画面が出てくるはずです。(出てこない場合は多分APP_CODE_PATH_HOSTのパス間違い)
4 MySQLへの接続
ハマった点2の説明です
LaradockのMySQLに接続したい時、
DB_CONNECTION=mysql
DB_HOST=mysql // 127.0.0.1
DB_PORT=3306
DB_DATABASE=wikiLearns
DB_USERNAME=homestead
DB_PASSWORD=secret
LaravelのDB_HOSTを127.0.0.1 -> mysqlに変更すれば接続できるはず...なんですが、PDOException::("SQLSTATE[HY000] [2002] Connection refused")が出てきます。このエラーはMySQLに認証されていないユーザーで接続しようとした時に発生します。MySQLのコンテナに入って新たにユーザー生成しましょう
1 ユーザー生成
「laradockのworkspaceコンテナからmysqlコンテナに接続」します。そうするとworkspaceからMySQLに接続してマイグレーション等ができるようになります
まずdocker inspectでworkspaceのIPアドレスを確認しましょう
$ docker-compose up -d nginx mysql
$ docker ps (これでworkspaceのコンテナIDを見られる)
$ docker inspect be68295513a3(workspaceのIPアドレス)
下の方にIPアドレスが書いてあります
"Gateway": "172.20.0.1",
"IPAddress": "172.20.0.3", <- これ
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:14:00:03",
"DriverOpts": null
MySQLコンテナに入ります
$ docker-compose exec mysql bash
# mysql -u root -p
# (パスワードはLaradockの.envのMYSQL_ROOT_PASSWORDを見る
デフォルトはroot)
データベースを作成
> create database wikiLearns(任意の名前);
ユーザー作成
> create user 'root(任意の名前)'@'172.20.0.3(workspaceのIPアドレス)'identified by 'secret(任意のパスワード)';
> grant all privileges on . to 'root'@'172.20.0.3';
2 .env編集
MySQLを出てLaradock、Laravelの.env編集
MYSQL_VERSION=5.7
MYSQL_DATABASE=wikiLearns(作ったデータベース名)
MYSQL_USER=root(作ったユーザー名)
MYSQL_PASSWORD=secret(設定したパスワード)
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d
DB_CONNECTION=mysql
DB_HOST=mysql // 127.0.0.1 → mysql
DB_PORT=3306
DB_DATABASE=dockapp(Laradockと同じに)
DB_USERNAME=root(Laradockと同じに)
DB_PASSWORD=secret(Laradockと同じに)
dockerを停止して再起動すればマイグレーションができます
$ docker-compose up -d nginx mysql
$ docker exec -it laradock_workspace_1 /bin/bash
$ php artisan migrate
これでdockerコンテナを立ち上げてlaravelを利用できるようになりました