Windows環境で、Docker共有フォルダ上にてMeteorを動かす（簡単編）

# 前書き

Windows環境(Macも）のBoot2Dockerの共有フォルダ上ではMeteorが起動できません。下のリンク先はVagrantの話ですが、どちらもWindowsではVirtualBoxのGuestAdditionsを使用して共有フォルダを実現しているので、本質は同一です。
[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)
（特にMongoはvboxsfファイルシステムに対応していないため？）
でも、慣れた環境で開発するには共有フォルダ上で作業できると楽ちんですよね。
そこで、
[DanielDent/docker-meteor](https://github.com/DanielDent/docker-meteor)
のイメージを使用して作業環境を作ります。
・・・というよりこのリンク先を見たらすべて書いてありますが・・・

# 準備
boot2dockerとMeteorをホストPCにインストールしている前提です。
まずは、`boot2docker up`もしくはデスクトップ上のBoot2docker startを実行して仮想マシンを起動します。

一応、起動した仮想マシンにssh接続してみます。

```
$ boot2docker ssh
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.7.1, build master : c202798 - Wed Jul 15 00:16:02 UTC 2015
Docker version 1.7.1, build 786b29d
docker@boot2docker:~$
```

ssh接続しなくても、通常のコマンドプロンプト上でdockerコマンドが使えますが、これはなまじ透過的な環境が提供されると誤解しがちになることが多いと思いますので、初学者こそssh接続したほうがかえってわかりやすいのでは、と感じます（自分のことですが）。

起動した画面上でDFを実行すると、共有フォルダがマウントされています。
(`/c/Users`の部分)

```
docker@boot2docker:~$ df
Filesystem                Size      Used Available Use% Mounted on
tmpfs                     1.8G    180.4M      1.6G  10% /
tmpfs                  1000.9M         0   1000.9M   0% /dev/shm
/dev/sda1                18.2G      6.1G     11.1G  36% /mnt/sda1
cgroup                 1000.9M         0   1000.9M   0% /sys/fs/cgroup
none                    238.5G     93.2G    145.3G  39% /c/Users
/dev/sda1                18.2G      6.1G     11.1G  36% /mnt/sda1/var/lib/docker/aufs
```

このように、boot2dockerでは、何も指定しなくとも
Windows環境であれば`c:\Users`フォルダ以下にアクセスできます。

```
docker@boot2docker:~$ cd /c/Users
docker@boot2docker:/c/Users$ ls
All Users     Default/      Default User  Public/       desktop.ini
```

この時、ドライブ名は小文字になっていること、`Users`は先頭のUが大文字になっているのに注意してください。
また、共有できるのは通常では`c:\Users`フォルダよりも下層のフォルダに限定されています。なので、`c:\temp`フォルダなどは共有できません。

# ホスト環境に共有させたいMeteorアプリを作成 or git clone

ホスト環境に共有させたいMeteorアプリを作成します or git cloneなどして配備します。
ただし、先に説明した通り`c:\Users`以下しか共有対象になりませんので、ここでは`c:\Users\<ユーザー名>\`以下に新規にMeteorアプリを配置します。

新規にコマンドプロンプトを起動して

```
cd %userprofile%
meteor create app
```

と、Meteorアプリを新規に配置します。ここで大事なのは、フォルダ名が「app」限定となっています。
なので既存プロジェクトをgit clone とする際にも、appフォルダに配備するように、名称を変更してください。

# dockerのイメージファイルを取得
ssh接続しているほうのコマンドプロンプトで、先ほど作成したappフォルダに移動します。

```
docker@boot2docker:/$ cd /c/Users/<ユーザー名>/app/
```

そのフォルダ上で

```
docker run --cap-add SYS_ADMIN -it --rm -p 3000:3000 -v "$(pwd)":/app danieldent/meteor vboxsf-shim meteor
```

を実行します。(1行で入力してください)すると、しばらく待っていたらイメージをダウンロード、インストール、そしてMeteorの起動までをします。

```
[[[[[ /app ]]]]]

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

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

試しに、ホスト側のブラウザで起動確認です。
`boot2docker ip`でIPアドレスを確認、ポート3000でアクセスします。
![browser.jpg](https://qiita-image-store.s3.amazonaws.com/0/26556/b9a16b73-b24a-3079-6594-84f2dddd6fbc.jpeg)

無事起動しています。

ホスト側でファイルをいじってみましょう。

```html:app.html
...
<body>
  <h1>Welcome to Meteor!</h1>

  {{> hello}}
</body>
...
```

h1のメッセージでも書き換えてみましょうか。

```html:app.html
...
<body>
  <h1>ようこそ Meteor!</h1>

  {{> hello}}
</body>
...
```

保存してしばらくするとブラウザ上の表示も書き換わります。
![browser2.jpg](https://qiita-image-store.s3.amazonaws.com/0/26556/04cf2562-b143-2830-1ff9-d3e8a707ea8d.jpeg)

# 終わり
これで、ファイルはホスト側と共有、環境はDockerに、といったような状態が構築できました。

要は、.meteor/localがvboxsf上にあるとMongoが起動できなくってコケるので、それ以外の通常のファイルシステム上にフォルダを適当に作成して、`mount --bind`でremapしたようにしてしまえば、Mongoも起動する、ということのようです。
（本当は推奨する解決策としては、データ専用のコンテナを作成、linkや--volume-forオプションを指定、という流れがいいようですが、面倒なので、簡単な方法でいきました）

今回は準備してもらっているイメージで動作させましたが、今後は、Vagrantで再度何をしているのか、動作確認をしながら構築してみたいです。

追記：書いてみました[Windows環境でVagrant+CoreOS+Dockerをセットアップして共有フォルダ上でMeteorが走るまで - Qiita](http://qiita.com/insight3110/items/03a41b2aaa6deb8d4c7f)