雑に用意するWindowsでのDockerを利用したLaravel開発環境

ここ最近、家では仮想マシンを立てずにLaravelの開発を行うようになりました。  
比較的簡単にLaravelの環境を作る手段はありますが、ここ最近自分が雑に、とりあえず動かせる環境を作る時の方法に関して書こうと思います。
今回は、クソ雑です。

# 環境

* Windows10
* Docker Toolbox(ネイティブのdockerの方でも良いですがDocker Toolboxを前提としています。あとバージョンが古いとdocker-composeが上手く動かないので比較的新しいの推奨)
* Laravel5.4を想定しています。

# とりあえずインストールする

すでにここでローカルにphpが入ってるの前提です。nodeもwindows内で動かすべきなのでそちらで対応します。

```
$ composer create-project laravel/laravel project-name
$ cd project-name
```

# docker-compose.ymlを作る

```
$ vim docker-compose.yml
```

できるだけ軽量のalpineイメージを使っていきますよ。

```
version: "3"
services:
  php-fpm:
    build: ./docker-assets/php-fpm/
    volumes:
      - ./:/app

  nginx:
    image: nginx:alpine
    volumes:
      - ./:/app
      - ./docker-assets/nginx/default.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "8080:80"

  mysql:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_USER: ${DB_USERNAME}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
    volumes:
      - ./docker-assets/datastore:/var/lib/mysql

  mail:
    image: mailhog/mailhog:latest
    ports:
      - "8025:8025"

```

## プロジェクトルートにdocker-assetsフォルダを用意して中身をつくる

```
$ mkdir docker-assets
$ cd docker-assets
$ mkdir nginx
$ mkdir php-fpm
```

### nginxフォルダの中にdefault.confを作ります。

```docker-assets/nginx/default.conf
server {
	listen 80;
    server_name localhost.local;
    index index.php;
    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /app/public;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
        index     index.php index.html index.htm;
        sendfile  off;
    }

    location ~ \.php {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_index index.php;
        fastcgi_pass php-fpm:9000;
    }
}
```

### php-fpmフォルダの中にdockerfileを作ります。

docker-assets/php-fpm/dockerfile

```
FROM php:7.1-fpm-alpine

RUN apk upgrade && \
  apk add ca-certificates && \
  update-ca-certificates

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

RUN docker-php-ext-install pdo_mysql mysqli mbstring bcmath
```

## .gitignoreに以下を追加しておく

```
/docker-assets/datastore
```

## .envのDBの欄を以下のようにする

```
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=password
```

DB_HOSTのmysqlはdocker-composeのリンク先の名前です。

# 起動する

docker toolboxを使ったことがない人もいると思うのでコマンドから順番に。
管理者権限でプロンプト動かさないと駄目かもです。

```
$ docker-machine start
```

ちょっと時間がかかるかもです。
続いて環境変数を登録しておく必要があります。

以下を叩いておきます。

```
$ @FOR /f "tokens=*" %i IN ('docker-machine env') DO @%i
```

あとは、プロジェクトのフォルダ上で

```
$ docker-compose up -d
```

です。これで簡易Laravel環境が作れちゃいます。
正直しっかりした環境が欲しい場合はLaradock等で開発環境を構築したほうが良いと思います。

# アクセスする

私の環境では192.168.99.100:8080でアクセスできるのですが、皆さんの環境がそうであるとは限らないのでdocker-machineのIPを調べます。

```
$ docker-machine ip
192.168.99.100
```

と、いったようにIPがわかりますのでこのIPのポート8080にアクセスすればおっけーです。

# マイグレーションとかどうしたら良いの？

```
$ docker-compose exec php-fpm /app/artisan
```

でコマンドが実行出来るので、こちらを使いましょう。