【Windows】Laravel Apache Mysql8 開発環境構築

# 前提
* WSL2(CentOS)
* Laravel:8
* nodeも使えるようなマルチビルドな構成にする

# ファイル構成
```docker-compose.yml
version: "3.8"
services:
  app:
    # どのポートを開いて繋ぐか。下記はコンテナの80番ポートを開いて、ホストの8000番につなぐ
    ports:
       - "50080:80" # localhost:50080
    build: ./docker/app
    container_name: app
    volumes:
      - ./src:/var/www/html
  db:
    build: ./docker/db
    container_name: laravel_db
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: laravel_db
      MYSQL_USER: laravel_user
      MYSQL_PASSWORD: laravel_pass
      TZ: 'Asia/Tokyo'
    # 起動時のコマンド
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    # ディレクトリ同期。設定ファイルとMySQLのデータが保存される場所を同期している。コンテナは基本的に起動時に変更されてもコンテナ自体が止まるとデータが消えてしまうため、保存しておきたいものはホストマシンと同期しておく必要がある。
    volumes:
      - ./docker/db/data:/var/lib/mysql
    #  - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
    ports:
      - 53306:3306
```

```app/000-default.conf
<VirtualHost *:80>
       ServerAdmin webmaster@localhost
       DocumentRoot /var/www/html/src/public
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
       <Directory /var/www/html/src/public>
           AllowOverride All
       </Directory>
</VirtualHost>
```

```app/Dockerfile
FROM node:14-buster as node
FROM php:7.4-apache
ADD php.ini /usr/local/etc/php/
ADD 000-default.conf /etc/apache2/sites-enabled/
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN curl -SL https://deb.nodesource.com/setup_14.x | bash
RUN apt-get update \
    # Laravel実行には必要
    && apt-get install -y \ 
    git \
    zip \
    unzip \
    vim \
    libpng-dev \
    libpq-dev \
    nodejs \
    && docker-php-ext-install pdo_mysql \
    && npm install -g npm@latest \
    && npm install -g @vue/cli
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin
WORKDIR /var/www
RUN composer global require "laravel/installer"

# Laravelで必要になるmodRewriteを有効化する
RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite
```

```app/php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```


```db/Dockerfile
FROM mysql:8

ADD my.cnf /etc/mysql/conf.d/my.cnf
RUN chmod 644 /etc/mysql/conf.d/my.cnf # 権限が644じゃないとWarning発生の為
CMD ["mysqld", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"]
```

```db/my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-authentication-plugin = mysql_native_password
# エラーログの設定
log-error = /var/lib/mysql/mysql-error.log

# スロークエリログの設定
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 5.0
log_queries_not_using_indexes = 0

# 実行ログの設定
general_log = 1
general_log_file = /var/log/mysql/mysql-query.log

# mysqlオプションの設定
[mysql]
# 文字コードの設定
default-character-set = utf8mb4

# mysqlクライアントツールの設定
[client]
# 文字コードの設定
default-character-set = utf8mb4
```

ここまでファイルを作成したら、
`docker-compose build --no-cache`
`docker-compose build up -d`
`docker-compose exec app bash`
(appコンテナに入った後) `cd html`
`composer create-project  --prefer-dist laravel/laravel src`
`cd src`
`chmod -R 777 storage`
↓でデバッグバー入れる
`composer require barryvdh/laravel-debugbar`
`php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"`  [参考](https://qiita.com/LowSE01/items/b72da1ccd7259ac27253)
`composer require laravel/ui "3.x" --dev` Laravelのバージョンによって、LaravelUIのバージョンも違うので注意。[参考](https://qiita.com/RealXiaoLin/items/a5ab2e11ae016f2ac6fb)

# そのほかインストール
## Tailwind
`npm install mix-tailwindcss --save-dev`

/webpack.mix.js
```
const mix = require('laravel-mix');
require('mix-tailwindcss');

mix.js('resources/js/app.js', 'public/js')
    .sass('resources/sass/app.scss', 'public/css')
    .tailwind();
```

# トラブルシューティング
## dbコンテナでmysqlがクラッシュ
[こちら](https://qiita.com/amagurix/items/4a3eba263aab5f0936d5)の記事とか見たが、結局はdataディレクトリを削除し再度ビルドすることで解決した。
※docker-compose down→dataディレクトリ削除→docker-compose build --no-cache