DockerでLaravel5のWelcome画面を表示する

Docker で Laravel5 のWelcome画面を表示するところまでを書いていこうと思います。
今回は CoreOS のオフィシャルイメージをもとにして、あれやこれやと自分で Dockerfile を書いてコンテナ立てていきます。
・・・が、自分は Docker 歴1週間ちょっとのひよっこなので間違ってたりするかもしれませぬ。
そんなときは容赦なく突っ込んでいただけると助かります。

# 用意するもの

1. docker engine
    * これがなくちゃ始まらないです
1. docker-compose
    * 複数コンテナの管理をいい感じにやってくれます
1. DockerHub アカウント
    * AutomatedBuilds を使ってDockerfileからイメージをビルドします
1. GitHub or Bitbucket アカウント
    * DockerHub の AutomatedBuilds は GitHub や Bitbucket への push をフックしてイメージをビルドしてくれます

# 今回の環境
今回は Vagrant で CoreOS の VM をたて、Docker ホストとして利用します。
`{VM_HOST} - {CoreOS} - {Docker Container}` という感じですね。

## VM_HOST のディレクトリ構成
```
$HOME/Dockerfiles - Dockerfile を格納します
$HOME/projects    - プロジェクトを格納します
$HOME/vagrant     - CoreOS のVagrantfileなどが格納されています
```

## CoreOS の Vagrantfile

デフォルトから変更したのは以下の部分です。
プロジェクトのディレクトリと Dockerfile のディレクトリを sync させ、ポートも8080ポートを VM の80ポートにフォワーディングしています。

```Vagrantfile
$shared_folders = {
  '/home/ta/Dockerfiles' => '/home/core/Dockerfiles',
  '/home/ta/projects' => '/home/core/projects',
}
$forwarded_ports = {
  '80' => '8080'
}
```

# リポジトリ作成
GitHub または Bitbucket に Dockerfile 用のリポジトリを作成します。
DockerHub ではあるリポジトリに push があると、その中の Dockerfile を全てビルドしているようなので、1Dockerfile 1リポジトリにしたほうがいいと思います。

# まずは PhpInfo を表示してみる
## 各種コンテナのベースとなるコンテナを作成する
### Dockerfileの作成
CentOS オフィシャルのイメージから、各種コンテナのベースとなるイメージを作成します。

`$HOME/Dockerfiles/centos67-base/Dockerfile` を以下のように作り centos67-base リポジトリに push します。

```Dockerfile
FROM centos:6.7

MAINTAINER {NAME} <{EMAIL}>

RUN yum -y update
RUN yum -y groupinstall "Base" "Development tools"
RUN yum clean all

RUN groupadd www-data
RUN useradd -d /home/www-data -g www-data -r -s /sbin/nologin www-data
```

### AutomatedBuilds
DockerHub へ行き、イメージをビルドしてもらいます。

1. アイコンの右に `Create => Create Automated Build` を選択します。
※このとき GitHub か Bitbucket のアカウントをリンクしていなければリンクするよう聞かれます。
1. `centos67-base` を選択
1. `Short Description` になにか適当に入力
1. `Create` ボタンをクリック
1. `Build Settings` タブを選択し、`Trigger` ボタンをクリック

あとは`Build Details` のStatusがSuccessに変わるまでのんびり待ちましょう。


## PHPコンテナを作成する
### Dockerfileの作成
さきほど作成したベースコンテナをもとにPHPコンテナを作ります。

`$HOME/Dockerfiles/php7-centos67/Dockerfile` と `$HOME/Dockerfiles/php7-centos67/etc/php-fpm.conf/www.conf` をそれぞれ以下のように作ります。

```Dockerfile
FROM miyamotota/centos67-base:latest

MAINTAINER {NAME} <{EMAIL}>

RUN yum install -y epel-release
RUN wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
RUN rpm -Uvh remi-release-6*.rpm
RUN yum --enablerepo=remi-php70 update php\*
RUN yum --enablerepo=remi-php70,epel install -y php php-cli php-common php-mbstring php-fpm php-gd php-gmp php-mbstring php-mcrypt php-opcache php-pdo php-xml php-mysql
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

COPY ./etc/php-fpm.d/www.conf /etc/php-fpm.d/

EXPOSE 9000
CMD ["php-fpm", "--nodaemonize"]
```

[www.conf](https://github.com/MiyamotoTa/php7-centos67/blob/master/etc/php-fpm.d/www.conf) は以下の箇所を変更しました。

```conf
user = www-data
group = www-data
listen = [::]:9000
listen.owner = www-data
listen.group = www-data
```

### DockerHub で Build
先ほどの手順と同様にビルドします。

## nginx コンテナの作成
こちらもベースコンテナをもとに Dockerfile を作成します。

`$HOME/Dockerfiles/nginx-php/Dockerfile`

```Dockerfile
FROM miyamotota/centos67-base:latest

MAINTAINER {NAME} <{EMAIL}>

RUN rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
RUN yum -y install nginx && yum clean all

COPY ./etc/nginx/nginx.conf /etc/nginx/
COPY ./etc/nginx/conf.d/default.conf /etc/nginx/conf.d/

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
```

設定ファイルは以下の2つを作成します。
[$HOME/Dockerfiles/nginx-php/etc/nginx/conf.d/default.conf]()
[$HOME/Dockerfiles/nginx-php/etc/nginx/nginx.conf]()

### DockerHub で Build
これも PHPコンテナと同様に DockerHub でビルドします。

## storage コンテナの作成
`index.php` を保存するコンテナを作ります。

`$HOME/Dockerfiles/storage/Dockerfile`

```Dockerfile
FROM miyamotota/centos67-base:latest

MAINTAINER {NAME} <{EMAIL}>

VOLUME /var/www/html
```

index.php と テスト用の html ファイルはひとまずこのリポジトリの中に含めてしまいます。
[index.php](https://github.com/MiyamotoTa/storage/blob/master/var/www/html/index.php)
[test.html](https://github.com/MiyamotoTa/storage/blob/master/var/www/html/test.html)

## コンテナをリンクするための docker-compose.yml の作成
docker-compose.yml を作成します。
今回は `$HOME/Dockerfiles/compose/phpinfo.yml` として作成します。

```yml
www-storage:
    image: miyamotota/storage:latest
    volumes:
        - ../storage/var/www/html:/var/www/html:ro

phpfpm:
    image: miyamotota/php7-centos67:latest
    ports:
        - "9000:9000"
    volumes_from:
        - www-storage

nginx:
    image: miyamotota/nginx-php:latest
    ports:
        - "80:80"
    volumes_from:
        - www-storage
    links:
        - phpfpm:php_host
```

## CoreOS で docker-compose
もうすぐ PhpInfo が見れます。
`cd $HOME/vagrant` して `vagrant up` して `vagrant ssh` で VM に入ります。

そして、 `cd Dockerfiles/compose/` したら `docker-compose -f ./phpinfo.yml up -d` を実行。

http://localhost:8080 にアクセスすると PhpInfo がみれると思います。
また、 http://localhost:8080/test.html も問題なくみれるはずです。
さらにローカルで index.php や test.html を変更すると Docker 上のファイルも変更されるので、再度読み込むと変更が反映されています。

なお、コンテナの停止は `docker-compose -f ./phpinfo.yml stop` で行えます。

----

# Laravel5 の welcome.blade.php を表示する
## Laravel5 プロジェクトの作成
`$HOME/projects` 配下に `l5` という名前の Laravel5 プロジェクトを作成しておきます。

## Dockerfile の作成
ここでは `nginx-php` コンテナに手を加えて Laravel 用の設定ファイルを配置した nginx コンテナを作っていきます。

`$HOME/Dockerfiles/nginx-laravel5/Dockerfile`

```Dockerfile
FROM miyamotota/nginx-php:latest

MAINTAINER {NAME} <{EMAIL}>

RUN rm /etc/nginx/conf.d/*
COPY ./etc/nginx/conf.d/laravel.conf /etc/nginx/conf.d/

CMD ["nginx", "-g", "daemon off;"]
```

[$HOME/Dockerfiles/nginx-laravel5/etc/nginx/conf.d/laravel.conf](https://github.com/MiyamotoTa/nginx-laravel5/blob/master/etc/nginx/conf.d/laravel.conf) はこのようにしました。

こちらも例によって DockerHub でビルドしておきましょう。

## docker-compose.yml の作成
Laravel 用の docker-compose.yml を作成します。

```yml
www-storage:
    image: miyamotota/storage:latest
    volumes:
        - ../storage/var/www/html:/var/www/html:ro
        - ../../projects/l5:/opt/l5

phpfpm:
    image: miyamotota/php7-centos67:latest
    ports:
        - "9000:9000"
    volumes_from:
        - www-storage

nginx-laravel5:
    image: miyamotota/nginx-laravel5:latest
    ports:
        - "80:80"
    volumes_from:
        - www-storage
    links:
        - phpfpm:php_host
```

今回は `$HOME/Dockerfiles/compose/laravel-test.yml` として作成しました。
PhpInfo のときと異なるのは VOLUME ディレクトリが増えたことと、image を nginx-laravel5 に変更したことの2つです。

## docker-compose
ビルドが完了したら Docker ホストに入り、`docker-compose -f ./laravel-test.yml up -d` を実行します。

http://localhost:8080/l5/ にアクセスして `Laravel5` の文字を眺めましょう。
お疲れ様でした！