Windows10 環境で Docker を使った快適な開発環境を作ろうとして諦めた話


10年以上 Macbook ユーザーな私ですが、MSのカンファレンス、de:code で色々刺激を受けたのと、最近 Bash on Ubuntu on Windows とか使えるようになったり、オープンソースコミュニティと仲良くし始めたりと、なかなかおもしろいなーと思って、Surface Pro4 を購入して「Macbookから乗り換えできるか？」というチャレンジをしてみました。
それから約1ヶ月経った今、この記事を Macbook Pro から書いています。結構頑張ったし、Windows10のいいところもいろいろ発見したんですが、結論から言えば、 **「Docker の実装がまだ中途半端」** ということで、私にとっては快適な開発環境は作れませんでした。

あくまで、私の技術不足でうまくいかなかっただけかもしれませんので、「そんなことないぞ」という反論を是非お待ちしております。

#やりたかったこと
Docker を使って、Rails の開発をしたかった。
通常、OSX であれば、以下の手順でさくっとDocker上にRailsのプロジェクトを作ることができます。

1. Docker 、Docker Toolbox をインストール
2. `docker-machine create` で Docker Machine を作る
3. Dockerfile 作る
4. Gemfile 作る
5. docker-compose.yml 作る
6. `docker-compose buid` で gem インストールなど
7. `docker-compose up` でサーバ立ち上げ
8. `docker-compose run` で rails プロジェクト作成したり、guard を実行したり
9. Gemfile を更新したら再度 `docker-compose build`

ここまでできたら、github などにDockerfileと合わせてpushしておけば、git clone したあと `docker-compose up --build` を実行すれば、開発環境を簡単に再現できます。

しかし！Windows ではそんなに事がうまくは運びませんでした・・・
色々試行錯誤した結果をログとして残しておきます。2016年6月時点での話なので、あなたがこの記事を読んでいる頃には、解消されている可能性もあります。

# そもそも、docker-machine create の時点で結構大変

期待していた Bash on Ubuntu on Windows では VM は動かないようです。というわけで Windows 用の Docker を使うのですが、docker-machine create の時点で一苦労でした。
Windows10 では Hyper-V という仮想環境マネージャがデフォルトになっておりまして、virtualbox のドライバが使えません。
ちゃんと動かすには、

* Hyper-Vマネージャーの GUI から外部ネットワークの仮想スイッチを作成
* docker-machine create -d hyperv --hyperv-virtual-switch [作った仮想スイッチ名] default で Docker machine を作成

という手順を踏む必要がありました。


# docker-compose run で Interactive mode が使えない
http://qiita.com/tksok2009/items/b21d11716dd912506789
にもあるように、-d をつけないと docker-compose ではコンテナ上のコマンドが実行できません。
-d をつけると、アウトプットが出なかったりするので、コマンドの実行結果がわからなくなってしまいます。
結局 docker exec -it [container] bash とかでログインしてコマンドを叩くことに・・・
もしくは docker run でも良いみたいですがその場合は -v オプションとか適切につけなくてはいけない。
面倒！

```bash
docker-compose run --rm web bundle exec guard --force-polling
```

とかやりたいのです僕は。

# ネットワークがオフラインになると docker-machine も動かない
OSXのDockerであればネットワークがオフラインになってもDocker自体は普通に使えるのですが、Windows上だと停止してしまいます。移動の多い私にとってこれは大変に不便。
あと、Wifi環境だとうまく仮想スイッチが作れないというのもありました。（これは私の仮想スイッチの作り方がいけないのかも）


# ホストOSのディレクトリがマウントされない
更にこれが辛かった。本来 docker-machine を立ち上げるとホスト側のユーザディレクトリが自動的にマウントされ、コンテナを作る際にも -v とかで指定のフォルダをコンテナ上にマウントできるわけですが、HyperV 環境だとすんなりとはマウントさせてくれないのです。docker-machine start をすると何事も無かったかのように普通に起動するんだけど、docker-machine ssh でアクセスして ls /Users とかやってみても、空のフォルダがあるだけ。したがって、docker-compose.yml 上で volume mount 指定をしていても、当然マウントされません。
色々調べてみた結果、
http://stackoverflow.com/questions/38261392/cant-mount-windows-host-directory-to-docker-container
にあるように、docker-machine 側から

```bash
sudo mount -t cifs //HOST-IP-HERE/c/Users /Users -o username=HOST_USERNAME_HERE -o password=pass
```

といったコマンドを実行すればマウントすることができました。また、
`/mnt/sda1/var/lib/boot2docker/bootlocal.sh`
というファイルに上記のmount文をいれておけば、毎回 ssh する必要は無いとか。

でも、このHOST IPを docker-machine 側から知る方法がわからなかったり、そもそも仮想スイッチ毎に docker-machine が必要だったりするので、やたらめんどくさい。
このへんで、キーっとなって OSX に戻ってきてしまいました。

でも改めて今調べてみたら、下記のページのようにHyperVマネージャーで共有フォルダ作ればよかったのか？
http://acchi-muite-hoi.hatenablog.com/entry/2016/06/20/042002


# 結論：HyperV + Docker は結構大変
というわけで、長年使い慣れた MacBook Pro に戻ってきてしまった話でした。ターミナルも快適ですしねー。
Windows10そのものはそんなに悪くなくて、Docker周り以外の部分は慣れれば結構快適だったので、こうすればできるよ！という方がいらっしゃったら是非教えていただきたいと思います。