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

前回、.envから環境変数を使えるようにして、かなり快適になった。
[Docker ComposeでLaravel開発環境を構築その肆](https://qiita.com/_bobtabo_/items/2afe45d78ca45951e64f)

だが、実際にこの環境を使って開発してみると色々と不便だったので修正する。

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

# Docker環境
* Nginx 最新版
* PHP（PHP-FPM） 7.4.x
* MySQL 8.x
* Composer 2.x
* Laravel 8.x
* Redis 最新版
* MailHog 最新版

# やること
* 不便なところを改修

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

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

# 不便だった箇所
* アプリ名をサーバー名に流用するのが使い勝手悪い
* コンテナ名も変更できると良い
* ポートも変更できると良い
* HTTPSが欲しい
* Redisも必要かな
* Laravel8のメール送信は、MailTrapじゃなくてMailHogだった

# .envファイルを修正する

https://github.com/bobtabo/docker3/blob/master/.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
```

↓下記に変更

```
# APP名
APP_NAME=laravel

# サーバー名
SERVER_NAME=laravel.local

# Nginx
NGINX_CONTAINER=nginx
NGINX_HTTP_PORT=80
NGINX_HTTPS_PORT=443
NGINX_CERTS_NAME=cert

# PHP
PHP_CONTAINER=php
PHP_XDEBUG_PORT=9000

# MySQL
MYSQL_CONTAINER=mysql
MYSQL_DATABASE=hoge
MYSQL_USER=fuga
MYSQL_PASSWORD=docker#DOCKER1234
MYSQL_ROOT_PASSWORD=docker#DOCKER1234
MYSQL_PORT=3306

# Redis
REDIS_CONTAINER=redis
REDIS_PORT=6379

# MailHog
MAILHOG_CONTAINER=mailhog
MAILHOG_PORT=8025
```

上記に合わせて、各ファイルを修正した。
（環境変数名のリネームは割愛）

# HTTPSの設定

オレオレ証明書を作る。

```
[Mac]$ openssl req -new -days 365 -x509 -nodes -keyout cert.key -out cert.crt
Generating a 2048 bit RSA private key
...........................+++
...................................+++
writing new private key to 'cert.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:ja
State or Province Name (full name) []:kanagawa
Locality Name (eg, city) []:yokohama
Organization Name (eg, company) []:company
Organizational Unit Name (eg, section) []:section
Common Name (eg, fully qualified host name) []:laravel.local
Email Address []:laravel.local
```

生成されたファイル達は下記に置き、docker-compose.ymlを編集する

![スクリーンショット 2021-02-11 14.58.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/73512b71-f5fa-cd2f-8895-05ecbb3e49d1.png)

### default.conf.templateを編集

```
server {
    listen 80;
  〜 略 〜
}

server {
    listen 443 ssl;
    server_name ${SERVER_NAME};

    ssl_certificate     /etc/nginx/certs/${NGINX_CERTS_NAME}.crt;
    ssl_certificate_key /etc/nginx/certs/${NGINX_CERTS_NAME}.key;

  〜 略 （以下、HTTPと同じ） 〜
}

```

### docker-compose.ymlを編集

```
version: '3.8'

volumes:
    phpsocket:

services:
  nginx:
    container_name: ${NGINX_CONTAINER}
    build: ./nginx
    ports:
      - '${NGINX_HTTP_PORT}:80'
      - '${NGINX_HTTPS_PORT}:443'
    volumes:
      - ./nginx/certs:/etc/nginx/certs
      - ./nginx/templates:/etc/nginx/templates
      - ./src:/home/docker
      - phpsocket:/var/run
    depends_on:
      - php
    environment:
      - APP_NAME=${APP_NAME}
      - SERVER_NAME=${SERVER_NAME}
      - NGINX_CERTS_NAME=${NGINX_CERTS_NAME}
 
  〜 略 〜
```

※参考
[Docker+nginxでHTTPSサーバを簡単に構築](https://qiita.com/yujimny/items/7615046be674895f9565)
[nginxでSSLを立てるまで](https://qiita.com/edo_m18/items/7e0e4b6d8e1e1d314184)
[[nginx] http と https を両方利用するための設定](https://gist.github.com/relax-more/5770895)

# Redisコンテナ追加

docker-compose.ymlに追加。

```
  redis:
    image: redis:latest
    container_name: ${REDIS_CONTAINER}
    ports:
      - "${REDIS_PORT}:6379"
    volumes:
      - "./data:/data"
```

# MailHogコンテナ追加

Laravel8のメール送信テストは、MailTrapからMailHogに変わってた。
docker-compose.ymlに追加。

```
  mail:
      image: mailhog/mailhog
      container_name: ${MAIL_CONTAINER}
      ports:
        - "${MAIL_PORT}:8025"
```

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

# 使い方

```
[Mac]$ cd <任意のディレクトリ>
[Mac]$ git clone https://github.com/bobtabo/docker4.git docker
[Mac]$ cd docker
[Mac]$ cp -p .env.example .env
[Mac]$ docker-compose up -d
・・・
Creating mysql   ... done
Creating mailhog ... done
Creating redis   ... 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:refresh --seed
```

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

### ブラウザで動作確認
http://laravel.local/
https://laravel.local/

<font color="blue">※httpsはSafariだと簡単に見れる（Chromeだと面倒）</font>

![スクリーンショット 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)

http://laravel.local:8025/
![スクリーンショット 2021-02-11 15.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111551/4e146315-6822-fc67-d75f-3d6d2c02c01c.png)


### コンテナ削除

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

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