はじめてのLaravel5＋Docker

Dockerに入門してみました。
Dockerを活かそう！というわけでPHPにも入門しました。
せっかくなので新しい感じのするLaravelを触ってみようというわけでMac + Docker + Laravelという環境でやってみました。
以下、その記録です。

##Dockerの準備
DockerでLAMP環境を作るには以下の記事を参考にしました。

[Docker Hubのオフィシャルイメージを使ったLAMP環境(Apache+PHP+MySQL)構築](http://qiita.com/naga3/items/be1a062075db9339762d)
[Docker Composeを使ってLAMP環境を立ち上げる](http://qiita.com/naga3/items/d1a6e8bbd0799159042e)
[docker-composeを使うと複数コンテナの管理が便利に](http://qiita.com/y_hokkey/items/d51e69c6ff4015e85fce)

今回の例では上記の参考記事（上２つ）で作成したDockerfileやdocker-compose.ymlがある前提で進めます。

##Laravelの準備
composerが必要なのであらかじめインストールしておきます。

```
composer global require "laravel/installer=~1.1"
```

これでインストール完了です。
最初のプロジェクトを作成します。

```
composer create-project laravel/laravel MyFirstLaravel
```

"Application key [(ランダムな英数列)] set successfully."と表示されたら成功です。
ここで表示されているApplication keyは暗号化の際に使用されるランダムな英数列です。
MyFirstLaravelディレクトリが出来ているの移動して「.env」ファイルを開いてみます。

```.env
APP_ENV=local
APP_DEBUG=true
APP_KEY=(ランダムな英数列)

DB_HOST=localhost
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

〜略〜
```

ここのAPP_KEYに先ほど出力されたApplication keyの値が設定されているのが分かります。
DB系の設定はDockerの環境に合わせて編集します。

```.env
DB_HOST=l72.XX.X.XXX
DB_DATABASE=testdb
DB_USERNAME=root
DB_PASSWORD=pass
```

DB_HOSTはDocker上で動いているmysqlコンテナのホストを指定します。
DB_DATABASEにはデータベース名を指定します。
あらかじめmysqlに作成しておきましょう。
ユーザー名とパスワードも設定に合わせて指定します。

##Laravel＋Dockerの準備
Lalavelをdockerで動かすためにもう少しdocker-compose.ymlの編集が必要です。
最終的な記述は以下の通りです。

```docker-compose.yml
mysql:
  image: mysql:5.7
  environment:
    MYSQL_ROOT_PASSWORD: pass
    MYSQL_DATABASE: testdb
    MYSQL_USER: test
    MYSQL_PASSWORD: testtest
  volumes:
    - ./my.cnf:/etc/mysql/conf.d/my.cnf
    - /var/lib/mysql
  container_name: mysql
php:
  build: php
  ports:
    - "80:80"
  volumes:
    - ./MyFirstLaravel:/var/www/html
    - ./apache2.conf:/etc/apache2/apache2.conf
  links:
    - mysql:mysql
  container_name: php
```

mysqlでデータベース「testdb」を作成し、testユーザーを追加しています。

```
environment:
  MYSQL_ROOT_PASSWORD: pass
  MYSQL_DATABASE: testdb
  MYSQL_USER: test
  MYSQL_PASSWORD: testtest
```

php側のvolumesでapache2.confを上書きしています。

```
volumes:
  - ./www:/var/www/html
  - ./apache2.conf:/etc/apache2/apache2.conf
```

Laravelのプロジェクト全体がコンテナから見えるようにMyFirstLaravelを/var/wwww/htmlにマッピングしていますが、Laravelはさらにその下のpublicディレクトリがドキュメントルートであることを想定して動作します。
Laravel側で変更する方法があるんだろうとは思いますが、ここではコンテナ側のapache2.confを上書きしてドキュメントルートを/var/www/html/publicに変更しています。

```apache2.conf
(省略)
DocumentRoot /var/www/html/public
(省略)
```

他の部分はコンテナに入っているapache2.confそのままから変更ありません。

phpコンテナはphpディレクトリにDockerfileを用意してビルドしています。

```Dockerfile
FROM php:5.6-apache
RUN apt-get update \
  && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev libmcrypt-dev \
  && docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcrypt \
```

次にMyFirstLaravel直下のstorageディレクトリのパーミッションを変更してコンテナのapacheから書き込めるようにしておきます。
サブディレクトリも全て変更しておきます。
これをしておかないと500 Internal ServerErrorが返ってきてハマります。

これでようやくコンテナを起動できます。
docker-compose.ymlのあるディレクトリに移動して以下のコマンドを実行します。

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

phpコンテナとmysqlコンテナが起動していることを「doker ps」で確認しましょう。
Laravelは最初にmigrateする必要があるので以下のようにして実行します。

```
docker exec -it php php artisan migrate
```

Dockerfileかdocker-compose.ymlで自動実行してくれる方法がありそうなんですが、わからず。。
とりあえず１コマンドだけ手動でながしこんでいます。

ブラウザからアクセスしてLaravelのWelcomeページが表示されれば成功です。
![screen1.png](https://qiita-image-store.s3.amazonaws.com/0/77573/4d0a0ffa-73f3-b9a3-4a07-676f63a96b5a.png "screen1.png")