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

  • 53
    Like
  • 5
    Comment
More than 1 year has passed since last update.

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 オプションとか適切につけなくてはいけない。
面倒!

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 側から

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周り以外の部分は慣れれば結構快適だったので、こうすればできるよ!という方がいらっしゃったら是非教えていただきたいと思います。