Docker ComposeでLaravel開発環境を構築その肆

前回、Laravelを別リポジトリ管理にして、かなりスッキリした。
[Docker ComposeでLaravel開発環境を構築その参](https://qiita.com/_bobtabo_/items/a6d11b4340c466e56319)

でも、ふと思った、、、Laravelのプロジェクト名を変えたいな。。。
今は、Nginxのconfにベタ書きなので、.envから設定したいなーって事で、やってみた。
ついでに、色々バージョン上げよう！

# マシンスペック
* Mac mini 2018
* macOS Catalina（10.15.x）
* Intel Core-i7 3.2GHz 6コア
* メモリ 32GB
* SSD 512GB

# Docker環境
* Nginx 最新版
* ~~PHP（PHP-FPM） 7.1.x~~ → <font color="blue">PHP（PHP-FPM） 7.4.x</font>
* ~~MySQL 5.7.x~~ → <font color="blue">MySQL 8.x</font>
* ~~Composer 最新版~~ → <font color="blue">Composer 2.x</font>
* ~~Laravel 5.6~~ → <font color="blue">Laravel 8.x</font>

# やること
* Docker Composeで環境変数を使う
* 色々バージョンアップする

# 補足
各環境を行ったり来たりするので、下記のように記載します。

```
[Mac]$ MacのターミナルでMac内の作業
[PHP]$ MacのターミナルからPHPコンテナに接続して作業
```

# .envファイルを作成する

環境ごとに.env作成したいので、.env.exampleを作成する。
中身は下記。

```
# APP名
APP_NAME=laravel

# XDebugポート
XDEBUG_PORT=9000

# DB
DATABASE_NAME=hoge
DATABASE_USER=fuga
DATABASE_PASSWORD=docker#DOCKER1234
DATABASE_ROOT_PASSWORD=docker#DOCKER1234
```

# IDEでブレークポイント止める為の準備

IDEでブレークポイント止まらなくてハマったので、ちゃんと書いておく。
ブレークポイント止める為には、下記のポート設定が影響ある。

```ini:php/xdebug.ini
xdebug.remote_port = 9001

```

```yml:docker-compose.yml
php:
    〜 略 〜
      - '9000:9001'
```
- コンテナ側のXDebugとPHP-FPM（デフォルト：9000）が同じポートだとダメらしいので、XDebugポートを9001にズラす。
- xdebug.remote_portとdocker-compose.ymlのコンテナ側ポートを同じにする。
- docker-compose.ymlのホスト側ポートとコンテナ側ポートを同じにしない。
- IDEでLISTENするポートはコンテナ側ポート（9001）。



※参考
[メモ PHP docker xdebug](https://qiita.com/tttreal/items/59cd31c59b29e902e39f#xdebug)

# .gitignoreの編集

https://github.com/bobtabo/docker2/blob/master/.gitignore

- .envは除外

```
.env
```

# docker-compose.ymlを編集

https://github.com/bobtabo/docker2/blob/master/docker-compose.yml

```
version: '3'

volumes:
    phpsocket:

services:
  nginx:
    〜 略 〜
    volumes:
      - ./src:/home/docker
      - phpsocket:/var/run
    depends_on:
      - php

  php:
    〜 略 〜
      - '9000:9000'
    volumes:
      - ./src:/home/docker
      - phpsocket:/var/run
    〜 略 〜

  db:
    image: mysql:5.7
    〜 略 〜
      MYSQL_DATABASE: hoge
      MYSQL_USER: fuga
      MYSQL_PASSWORD: docker#DOCKER1234
      MYSQL_ROOT_PASSWORD: docker#DOCKER1234
    〜 略 〜
```

環境ファイルを各コンテナで参照したいので、下記に変更。

```
version: '3.8'

volumes:
    phpsocket:

services:
  nginx:
    〜 略 〜
    volumes:
      - ./nginx/templates:/etc/nginx/templates
      - ./src:/home/docker
      - phpsocket:/var/run
    depends_on:
      - php
    environment:
      - APP_NAME=${APP_NAME}

  php:
    〜 略 〜
      - '${XDEBUG_PORT}:9001'
    volumes:
      - ./src:/home/docker
      - phpsocket:/var/run
    〜 略 〜

  db:
    image: mysql:8
    〜 略 〜
      MYSQL_DATABASE: ${DATABASE_NAME}
      MYSQL_USER: ${DATABASE_USER}
      MYSQL_PASSWORD: ${DATABASE_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${DATABASE_ROOT_PASSWORD}
    〜 略 〜
```

# Nginxのconf編集

https://github.com/bobtabo/docker2/blob/master/nginx/conf.d/default.conf

```
・・・
server_name laravel.local;
・・・
location / {
    root /home/docker/laravel/public;
    ・・・
}
・・・
location ~ \.php$ {
    root /home/docker/laravel/public;
    ・・・
}
```

上記に環境変数を埋め込むように修正。

```
・・・
server_name ${APP_NAME}.local;
・・・
location / {
    root /home/docker/${APP_NAME}/public;
    ・・・
}
・・・
location ~ \.php$ {
    root /home/docker/${APP_NAME}/public;
    ・・・
}
```

ただ、ドキュメントルートの環境変数埋め込みが、どうやってもエラーになって無理だった。
ドキュメントルートをlocationの外に出したら、環境変数を埋め込めました。

```
・・・
server_name ${APP_NAME}.local;
・・・
root /home/docker/${APP_NAME}/public;

location / {
    ・・・
}
・・・
location ~ \.php$ {
    ・・・
}
```

後述（default.confの置換）でファイル名を、conf.d/default.conf → templates/default.conf.templateにリネーム。

# default.confの置換

https://github.com/bobtabo/docker2/blob/master/nginx/Dockerfile

```
# 設定の置換
COPY conf.d/default.conf /etc/nginx/conf.d/default.conf
```

docker-compose.ymlのvolumesで解決する。

```
services:
  nginx:
    〜 略 〜
    volumes:
      - ./nginx/templates:/etc/nginx/templates
```

なので、Dockerfile内でのCOPYは不要になった

# Composer2.xをインストールする修正

https://github.com/bobtabo/docker2/blob/master/php/Dockerfile

```
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
```

latestにしてたから最新版が入ってると思いきや、何故か 1.x だったので 2.x で固定。

```
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
```

# XDebugのバージョン固定

https://github.com/bobtabo/docker2/blob/master/php/Dockerfile

```
RUN pecl install xdebug
```

このままだと、Xdebug 3.xがインストールされる。
Xdebug 2.x と Xdebug 3.x は、設定ファイルの記述が異なり、今までの設定だと動かない。（ハマった）
Xdebug 2.xに固定。（3.xの設定は、また今度）

```
RUN pecl install xdebug-2.9.8
```

# Laravelの準備

```
[Mac]$ docker-compose exec --user 1000 php bash

[PHP]$ rm -fdR laravel
[PHP]$ composer create-project --prefer-dist laravel/laravel laravel "8.*"
[PHP]$ cd laravel
[PHP]$ composer require --dev barryvdh/laravel-ide-helper
[PHP]$ composer require --dev squizlabs/php_codesniffer
[PHP]$ mkdir bin
[PHP]$ vi bin/clear-laravel.sh
---
#!/bin/bash
php artisan view:clear
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan clear-compiled
php artisan config:cache
composer dump-autoload
php artisan ide-helper:generate
php artisan ide-helper:models -N
php artisan ide-helper:meta
find . -name '._.DS_Store' -type f -ls -delete
---
:wq
[PHP]$ vi .env.example
---
:%s/DB_HOST=127.0.0.1/DB_HOST=mysql/g
:%s/DB_DATABASE=laravel/DB_DATABASE=hoge/g
:%s/DB_USERNAME=root/DB_USERNAME=fuga/g
:%s/DB_PASSWORD=/DB_PASSWORD="docker#DOCKER1234"/g
---
:wq
```

完成！！
https://github.com/bobtabo/docker3

※参考
[docker上のnginx.confに環境変数を適用する方法](https://qiita.com/shin-go/items/6cb4824944ddffb6e6a7)

# 使い方

```
[Mac]$ cd <任意のディレクトリ>
[Mac]$ git clone https://github.com/bobtabo/docker3.git docker
[Mac]$ cd docker
[Mac]$ cp -p .env.example .env
[Mac]$ docker-compose up -d
・・・
Creating mysql ... done
Creating php   ... done
Creating nginx ... done

[Mac]$ docker-compose exec --user 1000 php bash

[PHP]$ pwd
/home/docker

[PHP]$ cd laravel
[PHP]$ composer install
[PHP]$ chmod -R 777 storage
[PHP]$ chmod -R 777 bootstrap/cache
[PHP]$ cp -p .env.example .env
[PHP]$ php artisan key:generate
[PHP]$ chmod 755 bin/clear-laravel.sh
[PHP]$ bin/clear-laravel.sh
[PHP]$ php artisan migrate:fresh --seed
```

### 動作確認（Macのhosts編集）
```
[Mac]$ sudo vi /private/etc/hosts
★下記を点線内を追記
---
127.0.0.1 laravel.local
---
:wq
```

### ブラウザで動作確認
http://laravel.local/
![スクリーンショット 2021-01-21 23.02.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/020058fa-ab24-7bda-668a-bb9832c5892c.png)


### コンテナ削除

```
[Mac]$ docker-compose down --rmi all --volumes
```

※参考
[《滅びの呪文》Docker Composeで作ったコンテナ、イメージ、ボリューム、ネットワークを一括完全消去する便利コマンド](https://qiita.com/suin/items/19d65e191b96a0079417)