Heroku上でLaravel+postgreSQL+Redis構成の個人開発Webサービスを公開したい、俺みたいな人のためのDocker


# 概要

自分が個人開発用に構築しているDockerの開発環境を紹介します。
ざっくり内容をまとめると以下の通りです。

### 構築内容

- php-fpm
- Nginx
- postgreSQL
    - herokuではpostgreSQLがデフォルトのようなので一応postgreSQLにしています。MySQLでもできないことはないと思います。
- redis
    - laravelでのセッション管理に使用します。predis不使用です。

#### その他

- https-portalによるhttps化
- xdebug設定
- gzip圧縮させたcssやjsファイルへの対応

### 実行環境
- Windows 10 Pro
- Docker Deskptop for Windows (2.1.0.5)

### テンプレートのGithubリポジトリ
https://github.com/YotaArai/ya-laravel-template

### 注意

Dockerについての基礎知識などはこの記事では触れておりませんので、他の方のqiita記事などを参考にしてください

# ファイル内容
## ディレクトリ構成
```
[laravel-project]
　├── docker
　│　　└── php
　│　　│　　└── Dockerfile
　│　　│　　└── php.ini
　│　　└── web
　│　　　　　└── default.conf
　└── docker-compose.yml
```

※[laravel-project]は「laravel new [laravel-project]」などのコマンドで新しくプロジェクトを作成した時のディレクトリ名を想定しています

## docker-compose.yml
```yaml:docker-compose.yml
version: '3'
services:
  https-portal:
    image: steveltn/https-portal:1
    ports:
      - 80:80
      - 443:443
    depends_on:
      - web
    restart: always
    environment:
      DOMAINS: 'dockertest.com -> http://web:8000'
      STAGE: local
    volumes:
      - ssl-certs:/var/lib/https-portal
  web:
    image: nginx:1.15.6
    ports:
      - "8000:8000"
    depends_on:
      - app
    volumes:
      - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf
      - .:/var/www/html
    command: [nginx, '-g', 'daemon off;']
  app:
    build: ./docker/php
    volumes:
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
      - .:/var/www/html
  db:
    image: postgres:10.1
    ports:
      - "5432:5432"
    environment:
      - "POSTGRES_USER=postgres"
      - "POSTGRES_PASSWORD=secret"
    volumes:
      - db-data:/var/lib/postgresql/data
  redis:
    image: redis:latest
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
volumes:
  ssl-certs:
  db-data:
  redis-data:
```

## php
```dockerfile:/docker/php/Dockerfile
FROM php:7.2-fpm
COPY php.ini /usr/local/etc/php/

# install composer
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN apt-get update \
    && apt-get install -y git zip unzip vim libpq-dev libfreetype6-dev libjpeg62-turbo-dev libpng-dev

RUN docker-php-ext-install pdo_pgsql

RUN pecl install xdebug-2.9.8 && \
    docker-php-ext-enable xdebug

RUN pecl install redis && \
    docker-php-ext-enable redis

WORKDIR /var/www/html
```

```ini:/docker/php/php.ini
post_max_size=10M
upload_max_filesize=10M

[date]
date.timezone="Asia/Tokyo"

[xdebug]
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_host=host.docker.internal
xdebug.remote_port=9001
```

## web(nginx)
```conf:/docker/web/default.conf
server {
    listen 8000;
    server_name dockertest.com;

    gzip on;
    gzip_types image/png image/gif image/jpeg text/javascript text/css;
    gzip_min_length 1000;
    gzip_proxied any;
    gunzip on;

    root  /var/www/html/public; 
    index index.php index.html index.htm;

    client_max_body_size 10m;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   app:9000;
        fastcgi_index  index.php;

        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME /var/www/html/public/index.php;
        fastcgi_param  PATH_INFO $fastcgi_path_info;
    }
}

```

## その他

### redis設定

Heroku Redisでは接続情報のREDIS_URLが変更される可能性があるようなので、そのあたりを予め対応しておきます。
[Heroku上のLaravelでRedisを使う - Qiita](https://qiita.com/kuropen/items/222af1e4a84d7fe70bb1)
[Laravel5.5: セッションの保存にRedisを使う (Heroku) - Qiita](https://qiita.com/sutara79/items/053d65dc43d78bbe8d58)


```php:/config/database.php
<?php

if (getenv('REDIS_URL')) {
    $url = parse_url(getenv('REDIS_URL'));

    putenv('REDIS_HOST='.$url['host']);
    putenv('REDIS_PORT='.$url['port']);
    putenv('REDIS_PASSWORD='.$url['pass']);
}

use Illuminate\Support\Str;
```

### env

dockerの構築に合わせてenvファイルを書き換えます

```:.env
DB_CONNECTION=pgsql
DB_HOST=db
DB_PORT=5432
DB_DATABASE=postgres
DB_USERNAME=postgres
DB_PASSWORD=secret

SESSION_DRIVER=redis

# REDIS_HOST=redis
# REDIS_PASSWORD=null
# REDIS_PORT=6379
REDIS_URL=redis://hoge:null@redis:6379
```

### hosts

ipconfigコマンドを実行して
イーサネット アダプター vEthernet (DockerNAT)->IPv4 アドレスに表示されているIPアドレスに設定します

(googleのOAuthログインの実行確認の際に、.testなどのテスト用トップレベルドメインでは設定できないようだったので、自分は.comドメインにしています。)

```:hosts
# [DockerNAT IPv4アドレス] [https-portalで設定したドメイン]
127.0.75.1 dockertest.com
```

### launch.json

エディタやIDE側もxdebugの設定をします。
以下はvscodeでの設定例です。
これを行うことで、vscode上のブレークポイントを設定すればデバッグができるようになります。

```json:.vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Listen for XDebug",
      "type": "php",
      "request": "launch",
      "port": 9001,
      "log": true,
      "pathMappings": {
        "/var/www/html": "${workspaceFolder}"
      }
    }
  ]
}

```


## 実行
以下のコマンドでdockerコンテナを立ち上げます。
(自分はdocker拡張機能を入れたvscodeでF1押下から立ち上げています)

```:
docker-compose  up -d --build
```

あとはdockertest.com(https-portalで設定したドメイン)にブラウザで接続すればOKです

# おわりに

以上が、自分がいつも使っているdockerの内容です。
万人受けするものではないと思いますが、丸々コピーしていただいてもいいですし、足りない部分は追加したり、カスタムして使っていただければと思います。

### 参考URL

[docker-composeでNginx + Laravel5.8(PHP7.3) + PostgreSQLの環境を作る - Qiita](https://qiita.com/nagi125/items/775e7ebda4718f61a330)
[https-portalで既存のdocker環境をhttps化 | RE:ENGINES](https://re-engines.com/2019/03/28/docker-https-portal/)
[Apache(Heroku)+laravel+vue.js環境下でgzip圧縮によるサイトパフォーマンス向上 - Qiita](https://qiita.com/nittannittan/items/386f5e20478a28413429)