在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”设置的容器链接,可能需要重新启动。大概…