Docker × PHP7.3 × Laravel環境作ってみた

#はじめに
前回は [Dockerを使ってLaravel開発環境構築](https://qiita.com/A-Kira/items/1c55ef689c0f91420e81)でphp7.2を利用してLaravel環境を作成しましたが、今回はPHP7.3で構築していきます。
微妙に違うところもありますので、PHP7.3で構築したい人はこちらを参考にしていただければと思います。

#環境
Dockerとdocker-composeは用意できている前提です。
Docker version 19.03.2, build 6a30dfc
docker-compose version 1.24.1, build 4667896b

#構成
以下の構成を想定しています。


```
project
├── README.md
├── docker
│   ├── db
│   │   ├── data
│   │   ├── sql
│   │   └── my.cnf
│   ├── nginx
│   │   └── default.conf
│   └── php
│       ├── Dockerfile
│       └── php.ini
├── server
└── docker-compose.yml
```

#構築
環境構築の手順を解説を簡単に交えながら紹介していきます。

##1. ディレクトリ作成
まず、任意のディレクトリ(上記ではproject)を作成します。
その直下にdocker, serverを作成します。server直下にLaravelプロジェクトを作成します。

##2. docker-compose.yml作成
今回は、PHP, nginx, mysqlの３つのコンテナを想定しておりますので、以下のようになります。

```docker-compose.yml
version: '3'

services:
  php:
    container_name: php
    build: ./docker/php
    volumes:
      - ./server:/var/www

  nginx:
    image: nginx
    container_name: nginx
    ports:
      - 80:80
    volumes:
      - ./server:/var/www
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php

  db:
    image: mysql:5.7
    container_name: db
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test_db
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
```

###解説
各コンテナ共通として、container_nameでコンテナ名を付けています。
コンテナ間の接続の際のホスト名になります。

**phpコンテナ**
build: project/docker/php配下のDockerfileを参照して構築
volumes: 開発ディレクトリと公開ディレクトリをマウント

**nginxコンテナ**
image: nginxの公式イメージを使用
ports: ゲストとホストそれぞれの80番ポートで接続
volumes: 開発ディレクトリと公開ディレクトリをマウント & nginx設定ファイルの指定

**mysqlコンテナ**
image: mysqlの公式イメージ使用
restart: コンテナ再起動
environment: DBの設定
ports: ゲストとホストそれぞれの3306番ポートで接続

##3. Dockerfile作成
phpコンテナ構築時に使われるDockerfileをdocker/php/に作成します。
Composerのインストールは[公式](https://getcomposer.org/download/)を参考にしてください。

```dockerfile:Dockerfile
FROM php:7.3-fpm
COPY php.ini /usr/local/etc/php/

RUN apt-get update \
    && apt-get install -y zlib1g-dev libzip-dev mariadb-client \
    && docker-php-ext-install zip pdo_mysql

#Composer install
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin

WORKDIR /var/www

RUN composer global require "laravel/installer"
```

##4. PHP設定ファイル作成
PHPの設定ファイルをdocker/php/に作成します。以下、最低限の設定ですのでプロジェクトに応じて変更してください。

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

##5. nginx設定ファイル作成
niginxの設定ファイルをdocker/nginx直下に作成します。以下はLaravelでの運用を前提に記載しています。

```nginx:default.conf
server {
  listen 80;

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

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

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

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

```

## 6. MySQLの設定
```my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client]
default-character-set=utf8mb4
```

## 7. Laravelプロジェクト作成
では、dockerを起動して、Laravelプロジェクトを作成してみましょう。
docker-compose.ymlがあるディレクトリに移動して下記でdockerを起動してみましょう。
その後dockerに入って、Laravelプロジェクトを作成します。

```console
# docker起動
$ docker-compose up -d

# phpコンテナに入ります
$ docker-compose exec php bash

# Laravelプロジェクト作成
$ laravel new
```
server以下にLaravelの各ディレクトリやファイルができています。

##7. 動作確認
ブラウザからlocalhostにアクセスしてみましょう。以下のようにLaravelの画面が立ち上がっていれば成功です。
<img width="1254" alt="スクリーンショット 2018-09-30 21.19.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/290840/2bce8e3d-ef19-27f4-692e-f777def7362d.png">

MySQLのコンテナも確認しておきましょう。

```console
# mysqlコンテナに入ります
$ docker exec -it db bash

root@3fe3c5295b72:/# mysql -u root -p
Enter password: パスワード入力します
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.12 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```