LaradockでLaravel開発環境構築

[公式サイト](http://laradock.io)を参考にして、DockerでLaravel開発環境構築手順をなぞってみましたので、そのメモを残します。
かなり基本的なこともメモしているつもりなので、これからやってみようという方の参考になればと思います。

# 環境

* Docker for Mac

[Docker for Mac](https://docs.docker.com/docker-for-mac/)をインストールしています。

```
$ docker --version
Docker version 17.09.0-ce, build afdb6d4
$ docker-compose --version
docker-compose version 1.16.1, build 6d1ac21
```

# Laradockについて

[ここ](http://laradock.io)から引用します。

> Laradock is well known in the Laravel community, as the project started with single focus on running Laravel projects on Docker. Later and due to the large adoption from the PHP community, it started supporting other PHP projects like Symfony, CodeIgniter, WordPress, Drupal…

Laravelだけでなく、Symfonyなどの他フレームワーク環境もサポートするとのことです。（今となっては名前が少々紛らしい気もしますが。。）

# Getting Started

それでは[Getting Started](http://laradock.io/getting-started/)の手順をなぞっていきます。
今回は`A.2) Don’t have a PHP project yet:`を参考にしていきます。

## 任意のフォルダでLaradockをclone

```
$ git clone https://github.com/laradock/laradock.git
```

## 環境設定ファイルを編集

この後の手順でdocker-composeを実行することになりますが、その際にdocker-composeが参照する環境設定ファイルを用意します。
雛形がリポジトリ内に用意されていますので、これをコピーします。

```
$ cp env-example .env
```

`.env`ファイルについての説明は以下。

[The “.env” file](https://docs.docker.com/compose/environment-variables/#the-env-file)

コピーしたファイル内に`Application Path`を設定する箇所があるので、手順に従って編集します。
以下の場合、laradockディレクトリと同じ階層に`project-z`という名前でディレクトリを用意することになります。

```:.env
APPLICATION=../project-z/
```

以降の手順でnginxやMySQLの環境をビルドしますが、ホスト側のポートを設定する箇所がありますので、お使いの環境で利用可能なポートを設定するようにしてください。
私はnginxのポートを変更しました。

```:.env
NGINX_HOST_HTTP_PORT=18080
```

## docker-composeで環境構築

ここでは[Usage](http://laradock.io/getting-started/#usage)に記載されている例に従って、Webサーバとしてnginx、データベースにMySQLを導入します。
nginx/sites以下の設定雛形を編集します。
私はnginx配下にコピーしてから編集しました。

```
$ cp nginx/sites/laravel.conf.example nginx/laravel.conf
```

そして、`root`の設定を変更します。
今回は以降の手順で`myapp`という名前でlaravelのプロジェクトを作成するので、そのプロジェクトのpublicディレクトリをrootに設定します。

```:nginx/laravel.conf
root /var/www/myapp/public;
```

また、`nginx/Dockerfile`を編集して、`laravel.conf`を反映するようにします。

```:nginx/Dockerfile
ADD laravel.conf /etc/nginx/conf.d/
```

docker-composeでnginxとMySQLの環境をビルドし、さらにコンテナをバッググランドで起動します。
（私の環境では、nginxのビルドでエラーが発生しましたので、対処方法を後述します。）

```
$ docker-compose up -d nginx mysql
```

ビルドに成功していれば、コンテナがそれぞれ起動しているはずです。

```
$ docker-compose ps
         Name                        Command              State                       Ports                   
--------------------------------------------------------------------------------------------------------------
laradock_applications_1   /true                           Exit 0                                              
laradock_mysql_1          docker-entrypoint.sh mysqld     Up       0.0.0.0:3306->3306/tcp                     
laradock_nginx_1          nginx                           Up       0.0.0.0:443->443/tcp, 0.0.0.0:18080->80/tcp
laradock_php-fpm_1        docker-php-entrypoint php-fpm   Up       9000/tcp                                   
laradock_workspace_1      /sbin/my_init                   Up       0.0.0.0:2222->22/tcp  
```

なお、`workspace`および`php-fpm`については、依存関係が設定されているため、docker-composeの引数に指定していなくても実行されるようになります。

> Note: The workspace and php-fpm will run automatically in most of the cases, so no need to specify them in the up command.

## workspace上でプロジェクト生成

workspaceコンテナ上で作業をしていきます。
workspaceコンテナに入るには、以下のコマンドを実行します。

```
$ docker-compose exec --user=laradock workspace bash
```

`laradock`というユーザでログインしていますが、workspaceを構築する際に作成されたユーザです。（workspaceディレクトリ配下のDockerfileを参照）
また、Composerもすでにインストール済みですので、これを使ってプロジェクトを生成します。

```
$ pwd
/var/www
$ composer create-project laravel/laravel myapp
```

なお、`/var/www`は、`.env`に指定したAPPLICATIONのパスをマウントしています。（docker-compose.ymlで確認できます）
つまり、この例では`project-z`ディレクトリが相当します。
よって、上記コマンドで生成されたLaravelのプロジェクトは、ホスト側の`project-z`ディレクトリ配下に作成されることになります。

## Macのhostsを編集

上記手順で作成した`laravel.conf`では、バーチャルホストの設定で`server_name`にlaravel.devと設定していました。
ということで、`/etc/hosts`に以下の設定を追加しておきます。

```
127.0.0.1       laravel.dev
```

ブラウザから`laravel.dev:18080`に接続して、Laravelの初期画面が表示されれば目標達成です。
 
## 補足：nginxのビルドエラー

プロキシ未設定のためapkコマンドでこけました。
docker-compose.yml内nginxのビルドパラメータ（args）に`HTTP_PROXY`を渡すようにします。

```yaml:docker-compose.yml
nginx:
  build:
    context: ./nginx
    args:
      - PHP_UPSTREAM_CONTAINER=${NGINX_PHP_UPSTREAM_CONTAINER}
      - PHP_UPSTREAM_PORT=${NGINX_PHP_UPSTREAM_PORT}
      - HTTP_PROXY=${HTTP_PROXY}
```