Docker上でLaravelを動かしてみよう(laradockなしで)

# はじめに
Laradockを使わず、Laravelの開発環境をDocker上で構築していきます。
立ち上げるコンテナは、以下3つです。
1. nginx
2. PHP
3. MySQL

# 環境
- Docker version 18.09.2, build 6247962
- docker-compose version 1.23.2, build 1110ad01
- ホストOS:Mac OS Mojave 10.14.6（18G84）

# ディレクトリ構成

```bash

$ tree
.
├── docker
│   ├── nginx
│   │   └── default.conf
│   └── php
│       ├── Dockerfile
│       └── php.ini
├── docker-compose.yml
└── server
```

# Docker-composeファイル編集
今回は、nginx、MySQL、PHPの3つのコンテナを立ち上げます。

```yml:docker-compose.yml


version: '3'

services: 
  php: #phpコンテナを定義します。
    container_name: php #コンテナの名前
    build: ./docker/php #Dockerイメージがあるディレクトリ
    volumes: 
    - ./server:/var/www #データ永続化領域の定義
                        #今回はホストのserverディレクトリを、コンテナ内/var/wwwディレクトリにマウント
  
  nginx:
    image: nginx #nginxの公式イメージを使用
    container_name: nginx
    ports: #ホスト:コンテナポート間のマッピング
    - 8000:80 
    volumes: 
    - ./server:/var/www
    - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on: # コンテナ起動順番の制御、phpコンテナのあとにnginxコンテナを起動
    - php

  db:
    image: mysql:5.7
    container_name: db
    environment: #DB環境定義
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: docker
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      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 #image起動時に実行するSQLやスクリプト
    ports:
    - 3306:3306

```

# Dockerfile編集
まず、PHPコンテナ構築に必要なDockerfileを編集します。
Composerと、Laravelのインストールも済ませてしまいましょう。
Composerのインストールは、[公式サイト](https://getcomposer.org/download/)を参考にしてください。

```docker:/docker/php/Dockerfile


FROM php:7.2-fpm
COPY php.ini /usr/local/etc/php/

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

#Compose install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin
RUN mv composer.phar /usr/local/bin/composer


WORKDIR /var/www

RUN composer global require "laravel/installer"

```

# PHP設定ファイルの編集

```ini:/docker/php/php.ini

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

```

# nginx設定ファイルの編集

Laravel用に、nginxのconfigを編集します。

```conf:/docker/nginx/default.conf

server {
  listen 80;
    index index.php index.html;
    root /var/www/public;

  location / {
    root /var/www/public;
    index  index.html index.php;
    }

  location ~ \.php$ {

    try_files $uri =404;
    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;
  }
 }


```

# Laravelプロジェクトの作成
下記の通り、docker-compose.ymlファイルがあるディレクトリで3つ全てのDockerコンテナを起動します。
その後、PHPコンテナへ入り、Laravelプロジェクトを作成します。

```bash
$ docker-compose up -d #バックグラウンドでDockerコンテナを起動

$ docker-compose exec php bash #phpコンテナに入る

$ laravel new #phpコンテナ内で実行、Laravelプロジェクトを作成する


```

# 動作確認
ブラウザから、http://127.0.0.1:8000
へアクセスすると以下のように画面が表示されるはずです！

![https___qiita-image-store.s3.amazonaws.com_0_290840_2bce8e3d-ef19-27f4-692e-f777def7362d.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262745/8f424e7a-a9b4-f021-5315-157d9abdbbce.jpeg)


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

```bash

$ docker-compose exec db bash

$ mysql -u docker -p # dbコンテナ内で実行、パスワードは"docker"

```

# まとめ

DockerでLaravel環境を構築できましたね！