VagrantとcoreOSとdocker-composeでお手軽なPHP開発環境を作る

# tl;dr

リポジトリを作ったので、ここからcloneしてvagrantを起動するだけで試せます。
https://github.com/qube81/docker-compose-lamp

```bash
$ git clone https://github.com/qube81/docker-compose-lamp.git
$ vagrant up

# ...初回は結構待ちます...

# phpinfoが表示されます
http://localhost:8888

# docker/srcがドキュメントルートとsyncしているので、変更が反映されます
$ vim docker/src/index.php

# いらなくなったらvagrantで丸ごと消せます
$ vagrant destroy
```

dockerを直接使うとイメージが色々インストールされて容量を食ったり、設定とか面倒なので、色々試して終わったら`Vagrant destroy`でポイ、みたいなお手軽環境を作ってみました。上のリポジトリから使えるので、簡単なメモだけ書きます。

(※追記)
MacでVagrantのnfsマウントでエラーが出る場合があるようです。
こちら http://qiita.com/nagomu/items/57f4b5297b7841781891 の記事で解決しました。


## 環境

* Vagrant 1.8.6
* VirtualBox 5.0.28

多少古くても動くと思います。

## 要点のメモ


### Vagrant

vagrantのboxにcoreOSを指定します。

```:Vagrantfile
config.vm.box = "coreos-alpha"
```

coreOSにはDockerが入っていますので、下記ページに従ってdocker-composeをインストールします。
https://docs.docker.com/compose/install/

```:Vagrantfile
$get_compose = <<-'EOF'
  curl -L "https://github.com/docker/compose/releases/download/1.8.1/docker-compose-$(uname -s)-$(uname -m)" >  ~/docker-compose
  sudo mkdir -p /opt
  sudo mkdir -p /opt/bin
  sudo mv ~/docker-compose /opt/bin/docker-compose
  sudo chown root:root /opt/bin/docker-compose
  sudo chmod +x /opt/bin/docker-compose
EOF
config.vm.provision "shell", inline: $get_compose
```

最後に、docker-composeを起動します。

```:Vagrantfile
config.vm.provision "shell", inline: "docker-compose -f /tmp/docker/docker-compose.yml up -d", run: "always"
```

### docker-compose

dockerが公式に配布しているPHPやMySQLのイメージがありますので、そのまま使っちゃいます。
https://hub.docker.com/_/php/
https://hub.docker.com/_/mysql/

今回は7-apacheと5.7を使いました。バーションを変えたい場合はここで変えます。
それぞれ、設定ファイルを書いておくと反映されるようにしてあります。

```:docker/php/Dockerfile
FROM php:7-apache
COPY ./php.ini /usr/local/etc/php/
```

```:docker/mysql/Dockerfile
FROM mysql:5.7
COPY ./my.cnf /etc/mysql/conf.d/
```

app用とmysql用にコンテナを起動します。MySQLのデータを永続化させるためにmysqldataというのも作ってみましたが、使い方間違っているかもしれません。

```yaml:docker/docker-compose.yml
services:
  mysqldata:
    image: busybox
    container_name: docker-mysqldata
    volumes:
     - /var/lib/mysql
  mysql:
    build: ./mysql
    container_name: docker-mysql
    environment:
      MYSQL_ROOT_PASSWORD: pass
    volumes_from:
      - mysqldata
  app:
    build: ./php
    container_name: docker-app
    depends_on:
      - mysql
```

### ポートフォワーディング

dockerのappコンテナを80番で起動し、coreOS（Vagrant）の8888番で受けるようにしました。
さらに、ホストマシンでも8888で起動できるようにそのまま流します。
これで、ホストマシンで http://localhost:8888 で確認できるようになります。

```yaml:docker/docker-compose.yml
app:
    build: ./php
    ports:
      - '8888:80'　# <-- Vagrantでは8888番で起動
```

```text:Vagrantfile
config.vm.network "forwarded_port", guest: 8888, host: 8888 #　<-- Vagrantはそのまま横流し
```

また、MySQLについては一発で入る設定が難しかったので一旦以下のようにして入ります

```bash
# coreOSにSSHする
vagrant ssh

# dockerのコマンドでログインします
core@localhost ~ $ docker exec -it docker-mysql mysql -u phpuser -p phpapp
Enter password:(phppass)
```

また、appのコンテナからmysqlのコンテナへは'mysql'というホスト名で繋ぐことができます

```bash
core@localhost ~ $ docker exec -it docker-app bash
mysql -h mysql -u phpuser -p phpapp
Enter password:(phppass)
```



### Synced Folder

ファイルの共有設定もします

```yaml:docker/docker-compose.yml
app:
  volumes:
      - ./src:/var/www/html
```

```text:Vagrantfile
  config.vm.synced_folder "./docker", "/tmp/docker", type: "nfs"
```

以上の設定により、`docker/src`に置いたファイルはcoreOSの`/tmp/docker/src`となり、さらにDockerコンテナの`/var/www/html`に同期されます。


### 後片付け

コンテナを起動しているcoreOSごと消すことができます。

```bash
vagrant destroy
```


## まとめ

Vagrantとdocker-composeを使ってお手軽なPHP開発環境を作成する雛形について書きました。
Dockerの公式イメージにはfpm版のPHPやpostgress、wordpressといったものもありますので、簡単に差し替えられると思います。vagrant destroyで丸ごと片付けられるので、ちょっと試してみたいというときは便利ではないでしょうか。