Boot2dockerでMongodb

##Boot2dockerでMongodbを試す
やりたいこと：Boot2dockerのコンテナを用いて、Nodejsからmongodbにデータを保存し永続化する。
流れ：
　①Mongodbのコンテナを起動
　②Nodejsのサンプルコンテナを作成
　③Mongodbのデータ永続化

トライ＆エラーでやってみただけなので、他にやりようがあれば教えていただきたいです。
boot2docker-v1.7.0-linux-amd64で確認

##①Mongodbのコンテナを起動
```
docker run -d --name mongo1 mongo
```
「mongo1」という名前でmongoイメージを起動する
dockerコンテナ同士の通信を行うため「-p」によるポートフォワーディングは不要
※ここでエラーが出た人は③の手順を先に行ってください。

##②Nodejsのサンプルコンテナを作成
```
docker run -it --link mongo1:mongo1 --rm --name nodejs1 node /bin/bash 
```
「nodejs1」という名前でnodeイメージを起動する。
先ほど起動したmongo1コンテナをリンクさせる。
こちらは「-ti」で起動するため、ターミナルで入力が可能
```
npm install mongodb
```

適当なフォルダ（/root等)で上記コマンドを行い、mongodb接続用パッケージを取得。

```
//filename app.js
//mongodbからMongoClientを取得
var MongoClient = require('mongodb').MongoClient
    , format = require('util').format;
 
//Docker起動時にリンクした名前でホストを指定
  MongoClient.connect('mongodb://mongo1:27017/test', function(err, db) {
    if(err) throw err;
    console.log(err, db);
    //test_insertコレクションを作成・取得
    var collection = db.collection('test_insert');
    collection.insert({a:2}, function(err, docs) {
      // インサート結果を表示
      collection.find().toArray(function(err, results) {
        console.dir(results);
        // DBを閉じるのを忘れずに
        db.close();
      });
    });
  });
```
同じフォルダにapp.jsという名前で保存する。

```
node app.js
```
アプリを起動
```
[ { _id: { _bsontype: 'ObjectID', id: '****' },
    a: 2 }]
```
{a:2}というオブジェクトが登録されたことが確認できる。
2回実行すると
```
[ { _id: { _bsontype: 'ObjectID', id: '****' },
    a: 2 },
 { _id: { _bsontype: 'ObjectID', id: '****' },
    a: 2 }]
```
2個登録される。

##③Mongodbのデータ永続化
このままではデータを永続化できない（Dockerを破棄したら消失する）ため、
Mongodbの「/data/db」を外部領域に設定する。
・失敗したやり方
[Vboxsf](http://qiita.com/ranran/items/2bd34345bae6813f698f)を使うと以下のようなエラーがでてMongodbが起動しない。
ファイルシステムがext4でないため、エラーになるような気がする。
※マウントオプション時にuid=999として、mongodbユーザを直接指定してもNG

```
2015-08-01T16:00:54.235+0000 I STORAGE  [initandlisten] 	WARNING: This file system is not supported. For further information see:
2015-08-01T16:00:54.235+0000 I STORAGE  [initandlisten] 			http://dochub.mongodb.org/core/unsupported-filesystems
2015-08-01T16:00:54.235+0000 I STORAGE  [initandlisten] 		Please notify MongoDB, Inc. if an unlisted filesystem generated this warning.
2015-08-01T16:00:54.247+0000 I JOURNAL  [durability] Durability thread started
2015-08-01T16:00:54.248+0000 I JOURNAL  [journal writer] Journal writer thread started
2015-08-01T16:00:54.249+0000 I CONTROL  [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=6072d61d7aaf
2015-08-01T16:00:54.250+0000 I CONTROL  [initandlisten] 
2015-08-01T16:00:54.250+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2015-08-01T16:00:54.250+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-08-01T16:00:54.250+0000 I CONTROL  [initandlisten] 
2015-08-01T16:00:54.250+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2015-08-01T16:00:54.250+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-08-01T16:00:54.250+0000 I CONTROL  [initandlisten] 
2015-08-01T16:00:54.250+0000 I CONTROL  [initandlisten] db version v3.0.4
2015-08-01T16:00:54.250+0000 I CONTROL  [initandlisten] git version: 0481c958daeb2969800511e7475dc66986fa9ed5
2015-08-01T16:00:54.250+0000 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013
2015-08-01T16:00:54.250+0000 I CONTROL  [initandlisten] build info: Linux ip-10-146-31-239 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 BOOST_LIB_VERSION=1_49
2015-08-01T16:00:54.250+0000 I CONTROL  [initandlisten] allocator: tcmalloc
2015-08-01T16:00:54.250+0000 I CONTROL  [initandlisten] options: {}
2015-08-01T16:00:54.252+0000 I INDEX    [initandlisten] allocating new ns file /data/db/local.ns, filling with zeroes...
2015-08-01T16:00:54.340+0000 E CONTROL  [initandlisten]   mmap() failed for /data/db/local.ns len:16777216 errno:22 Invalid argument
2015-08-01T16:00:54.340+0000 F INDEX    [initandlisten] error couldn't open file /data/db/local.ns terminating
2015-08-01T16:00:54.340+0000 I -        [initandlisten] Invariant failure false src/mongo/db/storage/mmap_v1/catalog/namespace_index.cpp 249
〜ログ省略〜

***aborting after invariant() failure

```

・成功したやり方
1.Boot2dockerを停止した状態で、Virtualboxのストレージを追加する。
2.追加したストレージは/dev/sdbに登録されるので、以下の手順でフォーマット&マウント

```
fdisk /dev/sdb<<EOF
n
p
1


w
EOF
sudo mkfs.ext4 /dev/sdb
mkdir -p /home/docker/disk2
sudo mount -t ext4 /dev/sdb -o defaults /home/docker/disk2/ 

```

3.Mongodb起動
```
docker run -d --name mongo1 -v /home/docker/disk2/mongodb:/data/db mongo
```
4.②の手順でnodejsコンテナを起動し、アプリを起動する。
　※mongodb起動後でないと「−−link」で設定したコンテナのリンクが無効になるため、再度起動する必要がある。多分・・・