10年以上 Macbook ユーザーな私ですが、MSのカンファレンス、de:code で色々刺激を受けたのと、最近 Bash on Ubuntu on Windows とか使えるようになったり、オープンソースコミュニティと仲良くし始めたりと、なかなかおもしろいなーと思って、Surface Pro4 を購入して「Macbookから乗り換えできるか?」というチャレンジをしてみました。
それから約1ヶ月経った今、この記事を Macbook Pro から書いています。結構頑張ったし、Windows10のいいところもいろいろ発見したんですが、結論から言えば、 「Docker の実装がまだ中途半端」 ということで、私にとっては快適な開発環境は作れませんでした。
あくまで、私の技術不足でうまくいかなかっただけかもしれませんので、「そんなことないぞ」という反論を是非お待ちしております。
#やりたかったこと
Docker を使って、Rails の開発をしたかった。
通常、OSX であれば、以下の手順でさくっとDocker上にRailsのプロジェクトを作ることができます。
- Docker 、Docker Toolbox をインストール
-
docker-machine create
で Docker Machine を作る - Dockerfile 作る
- Gemfile 作る
- docker-compose.yml 作る
-
docker-compose buid
で gem インストールなど -
docker-compose up
でサーバ立ち上げ -
docker-compose run
で rails プロジェクト作成したり、guard を実行したり - 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周り以外の部分は慣れれば結構快適だったので、こうすればできるよ!という方がいらっしゃったら是非教えていただきたいと思います。