（超初心者向け）Laravelとdocker-composeでの開発環境構築

2年前に書いた以下の自分の記事がいい加減古臭くなってきたので、サクッとアップデートしようと思います。
それでもだいぶ枯れた技術の塊ですいません。

https://qiita.com/miutex/items/ebc13fc78da4a19a3da4
https://qiita.com/miutex/items/4a22a404d26d3ffd16f2

# やること
- Laravelインストール
- docker-composeによる設定、起動

公式ではHomesteadの利用が推奨されていますが、Dockerの方が文字通り「あっという間に」構築が完了しますし、複数人の開発者に展開する時にDockerの方が楽です。

# 開発環境
以下の内容はMacでやっています。
composerとDockerのインストールは済ませておいてください。

# ディレクトリ構成

最終的に以下のようになります。

root（親ディレクトリ）
├docker
｜ ├php
｜ ｜ └Dockerfile
｜ └web
｜　└default.conf
├Laravel
└docker-compose.yml


# 制作

## 1.Laravelフレームワークのインストール

```console:console
$ composer create-project laravel/laravel Laravel --prefer-dist
```

## 2.Dockerまわり
超初心者で本当に分からない場合は、Dockerまわりはとりあえずコピペで大丈夫です。

### Dockerfile

```console:Dockerfile
FROM php:7.2-fpm

# 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

RUN apt-get update \
    && apt-get install -y libpq-dev libzip-dev \
    && docker-php-ext-install pdo_mysql pdo_pgsql zip

WORKDIR /var/www/html
```

### default.conf

```console:Dockerfile
server {
    listen 80;

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

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

    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.yml

```console:docker-compose.yml
version: '3'
services:
    web:
        image: nginx:1.15.6
        ports:
            - "8000:80"
        depends_on:
            - app
        volumes:
            - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf
            - .:/var/www/html
    app:
        build: ./docker/php
        depends_on:
            - mysql
        volumes:
            - .:/var/www/html
        command: >
            bash -c 'cd Laravel &&
            composer install &&
            php artisan migrate &&
            cd .. &&
            php-fpm'
    mysql:
        image: mysql:5.7
        environment:
            MYSQL_DATABASE: test
            MYSQL_USER: homestead
            MYSQL_PASSWORD: secret
            MYSQL_ROOT_PASSWORD: secret
        ports:
            - "3306:3306"
        volumes:
            - mysql-test:/var/lib/mysql
volumes:
    mysql-test:
```

## 3.Laravel設定
LaravelのDB設定をDockerで設定したそれと合わせます。

```console:.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=homestead
DB_PASSWORD=secret
```

## 4.実行
実行ですが、docker-composeで起動時にcomposerのインストールとマイグレーションを入れてあるので、事前の準備が不要となっています。

```console:console
$ docker-compose up -d
（中略。初回はイメージ作成などで時間かかりますし大量のコンソールが出ます）
Starting test_mysql_1 ... done
Starting test_app_1   ... done
Starting test_web_1   ... done
```

こんな感じで。

で、localhost:8000にブラウザからアクセスしてみます。

<img width="1331" alt="スクリーンショット 2019-12-06 14.27.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214400/6816046d-d728-792e-30c5-ce200c2c2bf3.png">

はい来た。Laravelのデフォルトのホーム画面来た。

## ついでにHello World

```html:resources/views/hello.blade.php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Laravel</title>
    </head>
    <body>
        Hello World...
    </body>
</html>
```

```php:routes/web.php
Route::get('hello', function () {
    return view('hello');
});
```

これでlocalhost:8000/helloでHello Worldと画面に出ます。
こんな感じで。