使用 mongo docker 镜像

使用 mongo 镜像是很方便的,直接使用官方镜像就好了,为了今后更方便使用,这里给出依据 restheart-docker 中的 docker-compose.yml 裁剪出一个还不错的方案(也就是剪除 restheart 部分而已):

# vi docker-compose.yml

version: '2'

### Creates a named network with the default bridge driver
networks:
backend: ### Creates a permanent, named data volume
# This makes much easier to identify where the mongodb data is stored on host
# See: https://docs.docker.com/engine/userguide/containers/dockervolumes/#mount-a-shared-storage-volume-as-a-data-volume
volumes:
datavolume: services:
mongodb:
image: mongo:3.2
### Uncomment to name the container explicitly
# container_name: your-mongo-name
volumes:
- datavolume:/data/db
networks:
- backend
ports:
- "27017:27017"

运行 docker-compose -f docker-compose.yml up 后便会成功启动镜像了。上面需要解释的有两个地方,networksvolumes 会在第一次启动后新建一个网络与卷,名字分别为 <nowpath>_backend<nowpath>_datavolume,假设当前路径为 testmongo,则有如下输出(第一次):

Creating network "testmongo_backend" with the default driver
Creating volume "testmongo_datavolume" with default driver
Creating testmongo_mongodb_1
Attaching to testmongo_mongodb_1
mongodb_1 | 2016-12-11T13:15:09.269+0000 I CONTROL [initandlisten] MongoDB starting : pid=1 port=27017 dbpath=/data/db 64-bit host=4929d787dd14
[...]

此时可以查看网络与 volume 信息:docker network inspect testmongo_backend docker volume inspect testmongo_datavolume,特别是 volume inspect 可以看到存储的挂载点:

[
{
"Name": "testmongo_datavolume",
"Driver": "local",
"Mountpoint": "/var/lib/docker/volumes/testmongo_datavolume/_data",
"Labels": null,
"Scope": "local"
}
]

另外,container_name 是可配的,在实际使用时最好是进行配置。

数据库导出

上面得到的挂载点是存储着 mongo 信息的,但是当我们想到导出当前数据库时这些数据是不可用的(格式不对)。

预计需要用到的指令:MongoDB 备份(mongodump)与恢复(mongorestore)mongodumpmongoexport

docker-compose up 后,我们在数据表中添加一行记录:

在本地(Linux 主机或虚拟机)安装了 mongo (客户端)之后,运行 mongo 命令:

MongoDB shell version: 2.6.10
connecting to: test
Server has startup warnings:
[...]
>
# 新的数据,参考 http://www.runoob.com/mongodb/mongodb-insert.html

> use test
> db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})

数据表/集合(collection)导出可以直接使用 mongoexport 来导出:mongoexport --db test --collection users --out users.json

但是对一个数据库的导出是不可用的,mongodump --db test --out . 会在当前路径下生成一个空的 test 文件夹,而事实上是有一条数据的。这是一个需要解决的问题,在 SO 上有类似的解决方案:docker-machine ssh command for mongodump,答案中也有我的一些注释,整理一下如下:

想法是新建一个与挂载 volume(这里最好是一个本机路径,容易获取结果)的 mongo container,与当前正在运行的 mongo container 进行连接,执行 dump 指令:

# vi mongodumpFromDocker.sh
# A nice method to mongodump from Docker container sudo docker run \
--net testmongo_backend \
--link testmongo_mongodb_1:mongo \
-v $(pwd):/backup mongo:3.2 bash \
-c 'mongodump --out /backup --host $MONGO_PORT_27017_TCP_ADDR'
$ chmod +x mongodumpFromDocker.sh
$ ./mongodumpFromDocker.sh

这会当前路径下生成正确的包含数据与数据库信息的 test 文件夹。上面的 bash 文件中 testmongo_backend 是我们上面生成的网络,testmongo_mongodb_1 是因为我们没有指定 container 的名称,$MONGO_PORT_27017_TCP_ADDR 需要换为一个真实的 IP 地址,0.0.0.0 是不可用的,以我跑在 virtualbox 中的虚拟机为例,最后一行可以改为:

-c 'mongodump --out /backup --host 100.100.100.10'

-c 'mongodump --out /backup --host 100.100.100.10:27017'

数据库导入

mongorestore 可以很好的工作:

mongorestore -d test2 test 会在 mongo container 中新建一个与 test 文件夹包含的数据信息相同的数据表(collection) test2

总结

1.上面的用法并非是 production ready 的,特别是没有设置用户名与密码

2.mongo 的几个数据库/表迁移命令只有 mongodump 对 docker 不透明,感觉今后也许会有更新,毕竟我们是可以直接查询到数据内容的,无法一键备份是有些没有道理。

Good Luck & Have Fun!

user_mongo_in_a_docker_and_dump_database的更多相关文章

随机推荐

  1. (判断)window.open()窗口被关闭后执行事件

    $(function() { // start ready var $article_share=$('#body .article').find('li.share'); // $article_s ...

  2. Log4j(1)--hellloworld

    创建项目: 使用的是log4j-1.2.17.jar: log4j.properties: log4j.rootLogger=DEBUG, Console ,File #Console log4j.a ...

  3. Jmeter的参数配置

    Ramp-up Period(in seconds) [1]决定多长时间启动所有线程.如果使用10个线程,ramp-up period是100秒,那么JMeter用100秒使所有10个线程启动并运行. ...

  4. postman-2get发送请求

    文档地址:https://www.v2ex.com/p/7v9TEc53 第一个API请求 最热主题 相当于首页右侧的 10 大每天的内容. https://www.v2ex.com/api/topi ...

  5. MU-MIMO学习

    设备的认证查询 https://www.wi-fi.org/product-finder 1. MU-MIMO不会增大无线的最大速度 2. MU-MIMO需要路由器和客户端同时支持 3. 当你没有或者 ...

  6. Struts2单例和多例

    struts2中action是多例的,即一个session产生一个action如果是单例的话,若出现两个用户都修改一个对象的属性值,则会因为用户修改时间不同,两个用户访问得到的属性不一样,操作得出的结 ...

  7. ModelAttribute注解使用与spring重定向传参

    @ModelAttribute可以用于修饰controller里的方法和参数,将被修饰的对象的值绑定到指定名称的属性里.当修饰方法时,方法返回的值会在该controller里每个访问处理前绑定一次.修 ...

  8. Java中权限设置

    package think_in_java_access_contorl; import think_in_java_access_contorl.access.Cookie; /** * 1.在Ja ...

  9. pthread_create用法(转)

    在转载别人文章之前,说一下 pthread_create(); 创建线程返回值. 正常情况下,创建成功则返回 0 : 如果创建失败 通常返回常见的 错误返回代码为: EAGAIN #define   ...

  10. Maven(九)”编码 gbk 的不可映射字符“ 问题解决方案

    解决这个问题的思路: 在maven的编译插件中声明正确的字符集编码编码——编译使用的字符集编码与代码文件使用的字符集编码一致!! 安装系统之后,一般中文系统默认字符集是GBK.我们安装的软件一般都继承 ...