Windows10にDockerでLAMP環境を構築する

Dockerが流行っています。AWSでも採用されるとかなんとか。
じゃけんお勉強していきましょうねー。

```
$ docker --version
Docker version 1.11.2, build b9f10c9
$ docker-compose --version
docker-compose version 1.7.1, build 0a9ab35
```

### Docker?

仮想化技術の一つです。
VMwareやらVirtualBoxやらと違うのは、「コンテナ」という技術を使っているので、ハードウェアへの負荷が少ないとか何とか。
詳しくは、すごい人たちがいっぱい解説しているのでググってください。

### 開発環境に便利

先進的なところでは本番環境でもDockerを利用しているようですが、多くの場所では専ら開発環境に使われているのではないでしょうか（体感）。
小さなテキストファイルを渡すだけですぐに環境を構築できます。
一昔前はウンGBのVM一式をUSBで渡してたり、Windowsの環境変数をガチャガチャしてPHPのバージョン違いを共存させてたりしましたが、それももう不要です。

### やってみよう

お勉強がてら、古典的なLAMP環境を構築してみます。
環境は以下の通り。

- ホストOS: Windows10 Home
- Apache: 2.4
- PHP: 5.6
- MySQL: 5.7

はい、Windows10 Homeです。Mac欲しいんよ。高いんよ。

まずはDockerをインストールします。
ただし、[Docker for Windows](http://www.docker.com/products/docker#/windows)はWindows10 Homeだと「てめーらにはくれてやんねー　○○して寝ろ！」とまさに外道されるので、[Docker Toolbox](https://www.docker.com/products/docker-toolbox)の方を入れます。

インストール途中、パッケージ選択画面にVirtualBoxの文字が見えます。
実はDockerはLinux特有の機能を使っているため、Windows（Macも）では動きません。そのため、VirtualBox上で動かす必要があるのです。
「結局VMが必要なんじゃないですかやだー」
Docker for WindowsならVirtualBoxいらない（らしい）んですけどね。Homeだからね。仕方ないね。

### 下準備

無事インストールが終わると、デスクトップにDocker Quickstart Terminalというショートカットができているはずです。
おもむろにそいつを起動してみると、見覚えのある黒い画面が開きます。最初はDocker用のVirtualBoxを起動するためやや時間がかかるので、しばらく待ちましょう。

起動が終わるとコマンドが打てるようになります。基本的にはLinuxと同じものが使えます。
ホームディレクトリは C:\Users\ユーザー名 になっているので別途おもちゃ箱を用意した方がいいでしょう。

```
$ mkdir sandbox
$ cd sandbox
```

ここでDocker run うんたらかんたらと打てばコンテナが立ち上がります。
さて、Dockerでは各コンテナには多くの機能を持たせず、複数のコンテナを組み合わせて環境を作っていきます。
単純なLAMP環境であったとしても、最低でも2つのコンテナが必要です。

- Apache + PHP
- MySQL

これが6つ7つになったとき、わざわざ1つ1つDocker runコマンドを打っていくのは面倒くさい。
そこでDocker-Composeというツールを使います。これは、各コンテナの設定をymlファイルにまとめることで、コマンド1発で一気に立ち上げられるという便利なものです。
Docker Toolboxには最初から入っているので、特に設定する必要はありません。

### docker-compose.ymlを書く

早速Docker-Compose用のymlを書いていきます。
わざわざlinuxのコマンドを打っていますが、Windows上で操作しても全く問題ありません。

```
$ touch docker-compose.yml
```

``` docker-compose.yml
version: "2"

services:

  web:
    image: php:5.6-apache
    ports:
      - "80:80"

  db:
    image: mysql:5.7
    ports:
      - "3306:3306"
```

コンテナの雛形は「イメージ」という形で配布されています。
イメージは[Docker Hub](https://hub.docker.com/)に山ほど用意されています。コンテナ立ち上げ時に、元となるイメージがローカルにあればそれを使い、無い場合はDocker Hubから自動的にダウンロードしてきます。

`php:5.6-apache`
コロン前はイメージの名称、コロン後はタグの名称です。
同じイメージであっても、構成の違いによって複数のタグわけがされていることがあります。
ここではphpというイメージのうち、5.6とapacheがインストールされているものをwebという名で、mysqlというイメージのうち、5.7がインストールされているものをdbという名で立ち上げます。
なお今回使うphpとmysqlは、どちらも公式が用意しているイメージです。

御託は置いといて、早速立ち上げてみましょう。

### 立ち上げる

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

初回はイメージのダウンロードのためやや時間がかかります。
また、たまに「ネットワークが繋がってないよ」というエラーが発生します。VirtualBoxの問題なので、以下コマンドで再起動すればだいたい何とかなります。

```
$ docker-machine restart
```

docker-compose upが完了したら、状態を見てみましょう。

```
$ docker-compose ps
```

何やら2行表示され、両方ともStateがUPになっているかと思います。
早速つないでみましょう。IPを確認して……。

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

ブラウザでアクセスすると……。

> 403 Forbidden

ヽ(`Д´)ﾉ

まだまだあわあわあわわわ慌てるような時間じゃない。
実はこれ、単にDocumentRootに何のファイルもないから発生しているだけです。
直接コンテナに入ってindex.phpを作ってしまいましょう。
コンテナにはvimすら入っていないので、そのインストールから行っています。

```
$ docker exec -it sandbox_web_1 bash
# apt-get update
# apt-get install vim -y
# touch index.php
# vi index.php
```

``` index.php
<?php echo 'index.php';
```

保存後、exitで抜けます。
再度アクセスすると……。

> index.php

(ﾟ∀ﾟ)

くぅ〜疲れましたw
これにて構築完了です！

### これでは、いけませんね

まだApache上でPHPが動いただけです。MySQLの接続方法も不明ですし、第一どうやって開発しろというのか。viでやれというのか。そういう現場もあるけど。
次はデータの永続化、ホストOSとのディレクトリ共有、MySQLとの疎通をやっていきます。

--> [Windows10にDockerでLAMP環境を構築する　その2](http://qiita.com/kamonamban/items/6438702478391f7161a7)