【Docker×Windows】Hyper-Vが使えないならVagrantを使えば良いじゃない

# はじめに
　私物の開発PCにおいて、Windows10のHyper-VとDockerを使ってPHPの開発環境を作ろうと、ずっと下記のようなことをやってきました。
[Docker for Windowsでローカル開発環境(LAMP)を作るのにどハマリしたので備忘録。 - Qiita](http://qiita.com/saken649/items/61ee94032686aa18e79e)
[DockerでXDebug使ってPHPデバッグする際はremote_connect_backが使えない - Qiita](http://qiita.com/saken649/items/2a0c4e4c9c7a845b17ea)

　私物の開発PCはこれで安定稼働したものの、今度は会社の業務PCを新調することになり、またWindowsのDocker環境を作ることとなりました。

　私物PCはWindows10 Professionalだったので、Hyper-Vを活用したDocker for Windowsが使えましたが、新調した業務PCはWindows10 Home。
**つまりは、Hyper-Vが使えない＝Docker for Windowsが使えない。**
※Docker for Windowsは動作環境としてHyper-Vを要求します。

DockerToolboxとBoot2Dockerがあるから問題ないやろと思っていたら予想以上にハマったので、自分用の備忘録として残しておきます。

# とりあえず結論
　Hyper-Vが使えないならVagrantを使えば良いじゃない

# なぜ上記結論に至ったか
- infoレベルとはいえdockerコマンドを打つ度にエラーが出る
- Gitbash(+ConEmu)からdockerコマンドが打てない  
・いちいちDocker Quickstart Terminalを使うか、KitematicからPowerShellを呼ばないと使えない  
・ついでに言えばQuickstart Terminalは全然Quickstartじゃない
- ボリューム共有が利かない

この3点が決め手となり、上記結論に至りました。

# 検証環境
### 今回新調した業務PC(当初)
- Windows10 Home
- Docker Toolbox + Boot2Docker
- Virtualbox
- Gitbash MINGW64 + ConEmu

### 今回新調した業務PC(最終的に落ち着いた環境)
- Windows10 Home
- Docker(CentOS)
- Virtualbox + Vagrant + bento/centos-7.3
- Gitbash MINGW64 + ConEmu

### 参考：現状安定稼働している私物PC
- Windows10 Professional
- Docker for Windows
- Hyper-V
- Gitbash MINGW64 + ConEmu

## infoレベルとはいえdockerコマンドを打つ度にエラーが出る

```bash:Docker_Quickstart_Terminal
$ docker ps
time="2017-03-18T18:41:38+09:00" level=info msg="Unable to use system certificate pool: crypto/x509: system root pool is not available on Windows
```

`level=info`なので無視しても良いのですが、毎回出るのは地味にイヤ。
これを書いている3/18時点で現在進行系のバグ？らしいので解決を待つしかないようです。
https://github.com/docker/docker/pull/31705

## Gitbash(+ConEmu)からdockerコマンドが打てない

```bash:MINGW64
$ docker ps
error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.26/containers/json: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.
```
GitbashのMINGW64をConEmu経由で使用して、docker psを実行した結果がこれ。
Docker Quickstart Terminalから呼ばれるのもGitbashのMINGW64。
**ここに何の違いがあるというのだ！**

もっとも、dockerが実際に動いている環境はWindowsネイティブではなく、Virtualboxで動いているLinuxのVM上なので、その違いはあるかもしれません。
とはいえ、Quickstart Terminalで呼ばれるGitbashも普通にローカルの操作が出来るので、果たして何が違うのだろう、というのが疑問なのですが。。

## ボリューム共有が利かない
私物PCで使ってたのと同じ記述をdocker-compose.yml(+Dockerfile)に記載して実行。

```yaml:docker-compose.yml
version: '2'
services:
  testapp:
    container_name: testapp
    build: .
    expose:
      - '9000'
      - '587'
      - '25'
    ports:
      - '8000:80'
    volumes:
      - ../:/var/www/html
    privileged: true
    command: /sbin/init
```

```bash:Dockerfile
FROM docker.io/centos:6.8
RUN yum -y update
RUN yum -y install httpd
RUN yum -y install postfix
RUN yum -y install php
CMD chkconfig httpd on
CMD service httpd start
CMD chkconfig postfix on
CMD chkconfig postfix start
```

ボリューム共有もちゃんと記載してます。
満を持して`docker-compose build`からの`docker-compose up -d`。

`docker exec`して、`/var/www/html`を見るとファイルが・・・えっ、無い。

挙句Kitematicからは書き込めないだの、コンフリクトしただの言われたので、ここでついにブチ切れました。

# Vagrantを使えば良いじゃない
　というわけでサクッとVagrantに移行。
boxには「bento/centos-7.3」を使用して、vagrant up→vagrant ssh。

```
$ sudo su // vagrant→root

// docker-ioのインストール
# yum -y install docker-io
# systemctl enable docker
# systemctl start docker

// 公式マニュアルに従ってdocker-composeの導入
// cf. http://docs.docker.jp/compose/install.html
# curl -L https://github.com/docker/compose/releases/download/1.11.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

// 試してみる
# docker-compose --version
bash: docker-compose: command not found
```

## docker-composeにパスを通す
**docker-composeにパスが通っていない** ので、パスを通します。

```
# echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
```

`usr/local/bin`にパスが通っていないのが原因なので、ここにパスを通します。

```
# cd ~
# pwd
/root
# vi .bash_profile
```

rootユーザーのホームディレクトリの`.bash_profile`を編集します。

```
PATH=$PATH:$HOME/bin
```

となっている行を

```
PATH=$PATH:$HOME/bin:/usr/local/bin
```

と書き換えて保存。そして、

```
source .bash_profile
```

として、`.bash_profile`の変更を即時反映しちゃいます。


```
# echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/bin
# docker-compose --version
docker-compose version 1.11.2, build dfed245
```

これで無事にパスも通り、Vagrant上でdocker-composeが使えるようになりました。
あとは普通に使うだけ。

# おまけ
・Dockerコンテナ上ではHTMLファイルの類を`/var/www/html`に置いてやる必要がありますが、ボリューム共有をするのであれば、 **DockerホストのCentOS上ではどこでも良かったりします。**
(極端な話、CentOS上の/vagrantから/var/www/htmlでも可)

・ホストOSは **Apacheやnginxすら不要** だったりします。ホストOSの80番ポートに用は無いので。

# あとがき
　WindowsでDocker使うなら、実はHyper-Vで動くDocker for Windowsを使うのが楽なんじゃないかと思いました。結局のところ、一度vagrant upした上で更にsshで入らないと行けない、という手間が入るので。。
おまけにこのパターンではKitematicが使えない。
…まぁこれはさすがにコマンド慣れたので別にそんなに困りゃしないのですが。

　ちなみに同僚さんはMacなのですが、そちらは普通に動きました。