Windows環境でVagrant+CoreOS+Dockerをセットアップして共有フォルダ上でMeteorが走るまで

# 前書き
今、Meteor勉強中でwindowsでVagrant+CoreOS+Dockerをセットアップしたら、
コンテナ上にある共有フォルダ上ではMeteorが動作しなかったので
(mongoDBが起動しない)、まとめました。
[mongodb - Can't create working meteor.js project on a vagrant box - Stack Overflow](http://stackoverflow.com/questions/25712468/cant-create-working-meteor-js-project-on-a-vagrant-box)

[Windows環境で、Docker共有フォルダ上にてMeteorを動かす（簡単編） - Qiita](http://qiita.com/insight3110/items/30ec76a63ad4b79b1ba7)で簡単編の記事も書いたのですが、Vagrantで動作確認をしながらやってみました。

# 手順
##　各種ソフトのインストール
[Vagrant で Windows 上の VirtualBox に CoreOS のインスタンスを作成し、 Ubuntu 14.04 LTS のコンテナを作成し、 SSH で接続可能にする #vagrant #coreos #docker - Qiita](http://qiita.com/tbpgr/items/800ad117e234b38f0a80)
↑ここが詳しいです。

* [Vagrant](https://www.vagrantup.com/)
* [coreos/coreos-vagrant](https://github.com/coreos/coreos-vagrant)
* [Meteor](https://www.meteor.com/)
* [Git for Windows](https://msysgit.github.io/)

## プロジェクトフォルダを作成してcoreos-vagrantをclone
```
mkdir projects
git clone https://github.com/coreos/coreos-vagrant/
cd coreos-vagrant
```

さらに、テスト用にMeteorアプリも作成しておきます。

```
meteor create myApp
```


## 共有設定・vagrant-winnfsdプラグインを導入
[Windows上でcoreos-vagrantとsynced_folder | misty-magic.h](https://mistymagich.wordpress.com/2015/03/04/windows%E4%B8%8A%E3%81%A7coreos-vagrant%E3%81%A8synced_folder/)
↑にあるとおり、vagrant-winnfsdプラグインを導入します。
これがないと、自分の環境では共有フォルダは見えたものの、更新が全く出来ませんでした。

```
vagrant plugin install vagrant-winnfsd
```

また、coreos-vagrantフォルダにあるVagrantfileを編集して、共有フォルダの設定をします。
とりあえず、Vagrantfileがあるフォルダを共有してみます。

```ruby:Vagrantfile
ip = "172.17.8.#{i+100}"
config.vm.network :private_network, ip: ip
# Uncomment below to enable NFS for sharing the host machine into the coreos-vagrant VM.
config.vm.synced_folder ".", "/home/core/share", id: "core", :nfs => true, :mount_options => ['nolock,vers=3,udp']
```

`#config.vm.synced_folder...`の先頭についているコメントを削除して↑のようにし、保存します。

## vaglant up
vaglant boxを作成します。

```
vagrant up
```

作成できたら、ssh接続してみます。

```
vagrand ssh
```

もしくは、直接SSHで接続する場合は`C:\Users\<ユーザー名>\.vagrant.d\insecure_private_key`に
sshキーがあるので、それを指定します。パスワード接続はできません。

```
ssh core@172.17.8.101 -i %userprofile%\.vagrant.d\insecure_private_key
```

と入力すると、

```
The authenticity of host '172.17.8.101 (172.17.8.101)' can't be established.
RSA key fingerprint is 7e:d5:3f:da:b1:96:74:ef:5f:4a:9f:07:c7:8d:40:cc.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.17.8.101' (RSA) to the list of known hosts.
Last login: Mon Jul 20 19:12:35 2015 from 172.17.8.1
CoreOS alpha (745.1.0)
core@core-01 ~ $
```

と、ログインできます。

## Dockerfileでイメージを作成
自分の環境では、Dockerfileを作成しようとvimを起動すると、
`E437: terminal capability "cm" required`
とエラーが出て、画面が崩れてしまいました。

[vi起動時に「E437: terminal capability "cm" required」と表示されたらどうする？ - つばろぐ](http://tsubalog.hatenablog.com/entry/how-to-solve-terminal-capability)
にあるとおり、`export TERM=vt100`を実行し、改めて.bashrcを編集しようと
しましたが、リンクファイルとなっており、簡単には編集できませんでした。

そこで、[さくらのクラウドで予め用意されているCoreOSを試してみた - Qiita](http://qiita.com/hnakamur/items/dc22457eb8fa679b1dfd)の通り

```
$ rm ~/.bashrc
$ cp /usr/share/skel/.bashrc ~/.bashrc
```
と、いったん削除後、リンク元からコピーしました。

これでようやくDockerfileが編集できます。

再度、[Vagrant で Windows 上の VirtualBox に CoreOS のインスタンスを作成し、 Ubuntu 14.04 LTS のコンテナを作成し、 SSH で接続可能にする #vagrant #coreos #docker - Qiita](http://qiita.com/tbpgr/items/800ad117e234b38f0a80)こちらを参考にDockerfileを作成していきます。
超適当です。途中、ubuntuならではの問題(nodeをインストールすると、nodejsで
インストールされるなど）の対策や、aptのリポジトリをjaistにしたり（完全ではないけど）
Meteorのインストールまでしました。

```txt:Dockerfile
FROM ubuntu:14.04
MAINTAINER example <example@mail.com>
RUN sed -i s/archive.ubuntu.com/ftp.jaist.ac.jp/ /etc/apt/sources.list
RUN apt-get update && apt-get upgrade -y
RUN apt-get install git curl -y
RUN curl https://install.meteor.com/ | sh
RUN apt-get install nodejs npm -y
RUN sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
RUN apt-get install -y openssh-server
RUN useradd -m -s /bin/bash core
RUN mkdir -p /home/core/.ssh; chown core:core /home/core/.ssh; chmod 700 /home/core/.ssh
ADD .ssh/authorized_keys /home/core/.ssh/
RUN chown core /home/core/.ssh/authorized_keys; chmod 600 /home/core/.ssh/authorized_keys
RUN chown -R core:core /home/core/.ssh
RUN echo "core    ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers.d/core
RUN /etc/init.d/ssh start
RUN /etc/init.d/ssh stop
EXPOSE 22
```

保存したら、

```
docker build -t myrepo/ubuntu:meteor .
```

とDockerfileからイメージを作成します。
しばらく待っていると、

```
Step 17 : EXPOSE 22
 ---> Running in 351be98ae454
 ---> 07aa1aaebcf3
Removing intermediate container 351be98ae454
Successfully built 07aa1aaebcf3
```

とでれば、イメージ構築終了です。

# コンテナ起動
```
$ docker run -d -p 2222:22 -p 3000:3000 -v /home/core/share:/vagrant --privileged myrepo/ubuntu:meteor /usr/sbin/sshd -D
```

でsshサーバーを起動します。（確認だけであれば直接/bin/bashを-itオプションをつけて起動してもいいと思います）ここで、coreOS側で`/home/core/share`の共有フォルダを、
更にubuntu側では/vagrantフォルダに割り当てています。また、--privilegedオプションは、あとでPermission Deniedを避けるために付けています。

sshサーバーを起動したのであれば、別のコマンドプロンプトから

```
ssh core@172.17.8.101 -p 2222 -i %userprofile%\.vagrant.d\insecure_private_key
```

で、ubuntu側にログインできます。（ポートの22だとcoreOS側にログインしてしまいます）

コンテナにログイン後、Meteorが動作するために通常フォルダ内に適当にフォルダを作成します。
そして、Meteorアプリ内にある/.meteor/localフォルダをmountします。

```
# mkdir local
# sudo mount --bind local/ /vagrant/myApp/.meteor/local/
```

これで準備完了です。Meteorアプリフォルダに入って起動します。

```
# cd /vagrant/myApp/
# meteor
[[[[[ /vagrant/myApp ]]]]]

=> Started proxy.
=> Started MongoDB.
=> Started your app.

=> App running at: http://localhost:3000/
```

無事起動しました。
ブラウザで [http://172.17.8.101:3000/](http://172.17.8.101:3000/) を開くと
起動しています。

当然、ホストOS側でファイルを更新すると、コンテナ側のファイルも更新され、hot reloadで
ブラウザの画面も自動更新されます。(結構時間かかるときがありますが）

# 終わりに
Vagrantで作業しましたので、面倒ではありますが（途中いろいろ脱線しましたが）、その分自由度も高くどのようにも設定できる柔軟さはありだと思います。