在Boot2docker中使用Mongodb

使用Boot2docker来试用Mongodb。

我想要做的事情是:通过使用Boot2docker的容器,在Nodejs中将数据保存到mongodb,并进行持久化。

步骤如下:
1. 启动Mongodb的容器;
2. 创建Nodejs的示例容器;
3. 进行Mongodb的数据持久化。

只是试了试,如果有其他方法,请告诉我。
请确认在boot2docker-v1.7.0-linux-amd64上。

启动MongoDB容器。

docker run -d --name mongo1 mongo

使用名为”mongo1″的名称启动mongo镜像。
不需要通过”-p”进行端口转发以实现Docker容器之间的通信。
*如果在这里出现了错误,请先执行步骤③。

创建一个Node.js示例容器。

docker run -it --link mongo1:mongo1 --rm --name nodejs1 node /bin/bash 

使用「nodejs1」作为名称启动node镜像。
连接先前启动的mongo1容器。
这里使用” -ti “进行启动,可在终端输入。

安装npm 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}的对象。
如果再执行一次,将会有两个对象被注册。

③MongoDB的数据持久化

由于当前的情况无法对数据进行持久化(一旦销毁Docker,数据也会消失),因此需要将Mongodb的”/data/db”设置到外部存储区域。
失败的尝试方式是使用Vboxsf,会出现以下错误导致Mongodb无法启动。
可能是由于文件系统不是ext4而导致的错误。
注意,在挂载选项中直接指定mongodb用户为uid=999也是不可行的。

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.使用第2步骤启动Node.js容器并启动应用程序。
请注意,必须在Mongodb启动后才能有效使用通过”–link”设置的容器链接,可能需要重新启动。大概…

广告
将在 10 秒后关闭
bannerAds