docker-composeでNginx + Laravel5.8(PHP7.3) + PostgreSQLの環境を作る

## 概要
何番煎じかわかりませんが、仕事の関係でLaravelの環境を作る事になったので記事として残しておきます。
PostgreSQLなのはHerokuでHerokuConnectを使いたいという理由からです。
MySQLでも変更点はほとんどないでしょう。

## 構成図
![laravel-docker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23306/bc6b1e38-924e-d6df-e32c-e60b898ea40f.png)

## コードだけくれ！って人用に
https://github.com/nagi125/laravel-sample-on-docker

## コピペだけじゃなくて何故動くかも知りたい人用に
https://qiita.com/nagi125/items/526268ab63b6d82e62ac

## ディレクトリ構成
dockerというディレクトリを作成し、そこに色々格納するようにしてあります。

```
.
├── Dockerfile
├── app
├── artisan
├── bootstrap
├── composer.json
├── composer.lock
├── config
├── database
├── docker
│   ├── app
│   │   └── conf
│   ├── db
│   │   ├── data
│   │   └── sql
│   └── nginx
│       ├── Dockerfile
│       └── conf
├── docker-compose.yml
├── package.json
├── phpunit.xml
├── public
├── readme.md
├── resources
├── routes
├── server.php
├── storage
├── tests
├── vendor
└── webpack.mix.js
```

## Dockerfile
気をつけるところはPHPの拡張を入れるところでしょうか。
「docker-php-ext-install」を利用しないとinstallすることができませんでした。

```Dockerfile
FROM php:7.3.6-fpm

ENV TZ Asia/Tokyo
ENV COMPOSER_ALLOW_SUPERUSER 1

# install Lib for composer
RUN apt-get update -qq && \
    apt-get install --no-install-recommends -y libpq-dev git zip unzip && \
    apt-get clean && \
    rm -rf /var/cache/apt

RUN docker-php-ext-install mbstring pdo pdo_pgsql

# php.conf php-fpm.conf
COPY docker/app/conf/php/php.ini /usr/local/etc/php/php.ini
COPY docker/app/conf/php/docker.conf /usr/local/etc/php-fpm.d/docker.conf

# install Composer
RUN curl -sS https://getcomposer.org/installer | php && \
    mv composer.phar /usr/local/bin/composer && \
    chmod +x /usr/local/bin/composer

COPY . /app

WORKDIR /app
RUN /usr/local/bin/composer install -d /app

# change owner
RUN chown www-data:www-data -R ./
```

## docker-compose.yml
nginxとappで同じところにmountする事で静的ファイルも返せるようにしてあります。
また、コンテナのログはこちらの記事と同じように調整してあります。
https://qiita.com/nagi125/items/59f2cb1742e50053a6e2

```docker-compose.yml
version: '3'
services:
  nginx:
    container_name: nginx
    build: ./docker/nginx
    ports:
      - 80:80
    volumes:
      - ./:/app
    depends_on:
      - app

  app:
    container_name: app
    build: ./
    environment:
      APP_ENV: 'development'
      APP_DEBUG: 'true'
      LOG_CHANNEL: 'stderr'
      DB_CONNECTION: 'pgsql'
      DB_HOST: 'db'
      DB_PORT: '5432'
      DB_DATABASE: 'laravel_development'
      DB_USERNAME: 'docker'
      DB_PASSWORD: 'docker'
    volumes:
      - ./:/app
    expose:
      - 9000
    depends_on:
      - db

  db:
    image: postgres:10.6
    container_name: db
    environment:
      TZ: 'Asia/Tokyo'
      POSTGRES_USER: 'docker'
      POSTGRES_PASSWORD: 'docker'
      POSTGRES_DB: 'laravel_development'
    volumes:
      - ./docker/db/data:/var/lib/postgresql/data
      - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - 5432:5432
```

## Nginxの設定
Symfonyに比べるとシンプルに書けたので驚きました。

```default.conf
server {
    listen 80;

    root  /app/public;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

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

        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO $fastcgi_path_info;
    }
}
```

## 立ち上げコマンド
```
$ docker-compose build
$ docker-compose up
```

## 注意事項
vendorが作られない場合はdocker-composeのvolumeの仕様が悪さしている可能性がありますので、下記のコマンドを実行してください

```
$ docker-compose exec app composer install
```