【Laravel】Docker for WindowsでLaradock(+MySQL)の環境構築


はじめに

Docker for WindowsでLaradockの環境構築をして、Webアプリが作れるところまで記載しております。

DBに関してはMySQLでphpmyadminも利用できるようにしています。

※なおDockerのインストールに関しては割愛させていただいております。

環境構築


最初に大まかなアプリ制作までの流れをまとめておきます。

Laradockの起動


※Dockerのインストール後です

フォルダ作成。

$ mkdir laravel_app 
$ cd laravel_app

git cloneコマンドでLaradockのダウンロード後し.envファイルを作成
$ git clone https://github.com/laradock/laradock.git
$ cd laradock
$ cp env-example .env

.envファイルを編集(※MySQLのバージョンは8.0以上になっているとセキュリティの関係でDockerがうまく動作しないらしい)
APP_CODE_PATH_HOST=../laravel #laravelのプロジェクトファイル名に書き換え
DATA_PATH_HOST=../data #複数データを参照してしまう可能性があるため
COMPOSE_PROJECT_NAME=docker_mysql #dockerのコンテナ名を変更
MYSQL_VERSION=5.7 #latestから変更
DB_HOST=mysql #追記

(僕の場合は更にdocker-compose.ymlのphpmyadminのポート番号を8081に変更。※原因不明&後述※)
(MySQL Notifierインストールされてる方はこちらも毎回起動するので停止させておく。)

コンテナの初期化(実行コマンド※Dockerアプリは起動した状態※)

$ docker-compose up -d nginx mysql workspace phpmyadmin

プロジェクトの作成


プロジェクト作成
$ docker-compose exec workspace composer create-project --prefer-dist laravel/laravel . "6.8.*"
Application key set successfully.

以下で既にアクセスできるはずです。(Dockerの場合はphp artisan serveが不要。)

Laravelアプリ トップ画面 http://localhost/
phpmyadmin トップ画面 http://localhost:8081/

DB作成は以下でphpmyadminにログインして作成します。(もしくはコマンドで)

サーバ名:mysql
ユーザー名:root
パスワード:root

Laravelプロジェクト下の.envファイルを編集。

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=docker_mysql // phpMyAdminで作ったDB名に合わせる。
DB_USERNAME=root
DB_PASSWORD=root

コントローラー作成


$ docker-compose exec workspace php artisan make:controller ArticleController
Controller created successfully.

マイグレーションファイル作成


$ docker-compose exec workspace php artisan make:migration create_articles_table --create=articles
Created Migration: 2020_03_24_092458_create_articles_table

マイグレート


$ docker-compose exec workspace php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (0.13 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table (0.13 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (0.07 seconds)
Migrating: 2020_03_24_092458_create_articles_table
Migrated: 2020_03_24_092458_create_articles_table (0.05 seconds)

※phpMyAdminでDBを作成しておかないとマイグレートできないので注意してください!!

その他の主要コマンド


起動の確認


statusがupになっていれば起動中です。
$ docker ps


サービスの終了


docker-compose stop

再起動


docker-compose up -d nginx mysql workspace phpmyadmin

躓きポイント


ここからが僕がDockerでの環境構築で躓いた部分です。

docker-compose upでMySQLが起動しない問題


原因のほとんどはポート被りです。

対処法:①ローカルに落としているMySQLをオフにする②XAMPPのMySQLをオフにする

以下、エラー発生時の例。3306ポートが使えないの図。


対処法①ローカルに落としているMySQLをオフにする


Windowsでしたら以下のようにタスクバーを確認してください。

MySQLがいたらそいつが原因の可能性が高いです。

こいつを停止しましょう。

その後、コマンドを実行すると3306でも起動するようになります。


対処法②XAMPPのMySQLをオフにする


上記と同じように、もしXAMPPでMySQLを起動していたとしたらエラーの原因になります。

こちらもStopしてから再起動すれば起動します。

ちなみに両方共存させたくてポート番号を変更したい場合は以下です。

.envファイル上で3306と記載の部分を3307に変更して再度compose upすると3307で起動します。

 

phpMyAdminが起動しない問題


対処法:ポート番号を変更する。


docker-compose.ymlのphpmyadminのポート番号を8081に変更。
//ポートのみ変更した場合
phpmyadmin:
      build: ./phpmyadmin
      environment:
        - PMA_ARBITRARY=1
        - MYSQL_USER=root
        - MYSQL_PASSWORD=password
        - MYSQL_ROOT_PASSWORD=password
    ports:
    - 8081:80

//サーバ名を調べるのに試行錯誤したパターン。※ログインエラー。
mysql:
      build:
        context: ./mysql
        args:
          - MYSQL_VERSION=${MYSQL_VERSION}
      environment:
        - MYSQL_DATABASE=DB
        - MYSQL_HOST=DB
        - MYSQL_USER=root
        - MYSQL_PASSWORD=password
        - MYSQL_ROOT_PASSWORD=password
        - TZ=${WORKSPACE_TIMEZONE}

phpmyadmin:
      build: ./phpmyadmin
      environment:
        - PMA_ARBITRARY=1
        - PMA_HOST=mysql
        - PMA_USER=root
        - PMA_PASSWORD=password
      ports:
        - 8081:80

その後コマンドを実行すると起動します。

※8080ポートが何に使用されているのか原因は掴めませんでした。。。わかり次第追記します。

phpMyAdminログインできない問題


正直、これは既に上述の内容ができていればわかることなのですが。。。

そこに至るまでに個人的に躓いたことだったので一応記載しておきます。

対処法:①.envファイルに従う②rootユーザーでログインする。

http://localhost:8081でphpmyadminへアクセス。

以下の画面になります。

XAMPPではこのような画面は出ないので困惑する人も多いはず。。。

対処法:①.envファイルに従う


laravel-practiceの.envに従い入力したところログインに成功。
サーバ:mysql
ユーザー:default
パスワード:secret

以下参照

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3307
DB_DATABASE=default
DB_USERNAME=default
DB_PASSWORD=secret

※ただしこちらは編集権限がありません。(意味ない。。。)


対処法:②rootユーザーでログインする。


実は.envファイルに以下のような記載があります。
MYSQL_ROOT_PASSWORD=root

ユーザー:root
パスワード:root

以上で、ログインすると編集できます◎

また、コマンドラインでも以下のように実行可能です。

mysql -u root -p root //こちらからもアクセス可能

create database default; //DB作成

おわりに

あまりにもわかりにくい記事だったため大幅に内容を修正しました。

以前の格闘感丸出しの記事は一応こちらにございます。

参考記事

Windows10でLaradockを使ってLaravel 5.5環境を作る https://qiita.com/sket88/items/4de708ce394179c61d8a

DockerでMySQL複数バージョンを共存させる https://qiita.com/tanakaworld/items/427b94ea0435b5dccfa2

LaradockのMySQLに接続できなくてはまった話 https://qiita.com/dnrsm/items/4bd078c17bb0d6888647

laradockの環境設定からMySQL接続まで https://qiita.com/yknsmullan/items/dea4102cf14b1b66e5af

docker起動でportが確保できないエラーの解決 https://nijoen.net/blog/773/

Dockerでコンテナの停止・削除ができなくなった時の対処法 https://qiita.com/musatarosu/items/31d6293a93e75ca6073e

docker docker-compose コマンド https://qiita.com/souichirou/items/6e701f6469822a641bdd

参考書籍