Vagrant + Docker でフロントエンドの開発環境が整えられるか?
追記: 2014-10-20 17:19
問題点に挙げている「vm が使い回せない」だが、Vagrant プロジェクトを一つにしてしまっていることが原因だった。これについては、また後日追記する。
バックエンド開発では毎回お世話になっている Vagrant だが、フロントエンド開発でも使えるのか試してみた。
なぜ Vagrant + Docker で開発環境を整えたいかと言うと、次の二点が挙げられる。
- ローカル環境を汚さずに Windows/Mac で開発環境を整えることが容易になるのではないか。
※ 開発環境は Docker のイメージとして提供されるので、OS 間の環境構築の面倒を解消してくれるはず - vm を再利用し、コンテナを用意することで省スペースでの開発が可能になるのではないか。
結論から言うと、環境は整えられるが思った様にはいかなかった。
使い方から間違っているかもしれないが。
とりあえずテストとして次の Vagrantfile を書いた。
この Vagrantfile があるディレクトリで vagrant up
を実行すると、proxy vm の作成が行われる。
今後 docker コマンドはこの proxy vm から実行されるが、Vagrant を使用する上で気にする必要はない。
synced_folder に nfs を指定しているので、Windows では動かないはず。これについては別のオプションを検討した方が良い。
※ nfs の代わりに rsync を試してみたが、自分が持っている Windows 機では同期がうまくいかなかった。
そして肝心のイメージだが、dockerfile/nodejs-bower-grunt
を採用した。
vagrant up
が成功すれば、以下のコマンドが使用可能になる。
Run node
vagrant docker-run develop -- node ...
Run npm
vagrant docker-run develop -- npm ...
Run bower
vagrant docker-run develop -- bower ...
Run grunt
vagrant docker-run develop -- grunt ...
これらのコマンドは、コンテナ内では synced_folder で指定した /data
において実行される。
今回は proxy.vm.synced_folder ".", "/data"
としているので、Vagrantfile と同階層に各種設定ファイルを用意してコマンドを実行してあげれば良い。
自分はテストとして package.json
を用意して vagrant docker-run develop -- npm install
を実行してみた。
node_modules がコンテナ内に生成され、同期されてローカルにも生成されたので成功と言える。
問題点
Windows で同期がうまくいかない
単に環境の問題かもしれないが、これでは使えると言えない。
vm が使い回せない
Docker だし、コンテナを複数作れば vm はひとつで良いのかな?と思っていたのだけど、Vagrant は作成する vm の名前を指定(この場合 docker_proxy)していて、且つ作成済みの場合は同名の vm が存在しているとエラーを吐いて終了する。
つまり、上の Vagrantfile をコピーして使い回すことができない。
設定次第でうまく回避できるのかもしれないが、よくわからなかった。
結論
ローカル環境を汚さない点や、そもそも環境を用意してくれている点で良いが、複数 vm を作るのは Docker の利点が無いかなと思った。