0
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 5 years have passed since last update.

LaradockでLaravel環境を構築する流れとMySQL接続について

Last updated at Posted at 2019-10-23

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側)

まずは公式ドキュメント通り

$ git clone https://github.com/laradock/laradock.git
$ cd laradock
$ cp env-example .env

ここで.envファイルを編集します

laradock.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に変更しました

それともう一つ

laradock.env
### 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起点での任意のパス)に書き換えてください

laradock.env
APP_CODE_PATH_HOST=../laravel/wikiLearns // ../

コンテナ再起動

$ docker-compose up -d nginx mysql

ブラウザでhttp://localhost:8888/ につなぐと例の画面が出てくるはずです。(出てこない場合は多分APP_CODE_PATH_HOSTのパス間違い)

4 MySQLへの接続

ハマった点2の説明です

LaradockのMySQLに接続したい時、

Laravel.env
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編集

laradock.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
Laravel.env
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を利用できるようになりました

0
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
0
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?