MongoDB
MongoDB 是一款可扩展、高性能的开源文档数据库(Document-Oriented),是当今最流行的NoSQL数据库之一。它采用C++开发,支持复杂的数据类型和强大的查询语言,提供了关系数据库的绝大部分功能。由于其高性能、易部署、易使用等特点,MongoDB得到了广泛的应用。
MongoDB (源自“humogous”)是一个面向文档的跨平台数据库,避开了传统关系型数据库结构,转而使用动态类似于JSON 的BSON格式,使其能轻松的将多个数据写在同一类型中。MongoDB以AGPL 和 Apache License 联合协议发布。
1 使用官方镜像
用户可以使用docker run指令直接运行官方mongoDB镜像:
$ docker run --name mymongo -d mongo
$ docker ps
$ docker exec -it mymongo sh
# 通过mongo指令启动mongodbDB交互命令行
# mongo
-> show dbs
# 通过db.stats() 指令查看数据库状态
-> db.stats()
# 通过 env 指令查看环境变量的配置
/ # env
1.1 连接mongoDB 容器
使用 --link 参数,连接新建的mymongo 容器,进入容器后,使用ping指令测试mymongo 容器的连通性
$ docker run --name mongo-link-mycontainer -it --link mymongo:db alpine sh
/ # ls
/ # ping db
1.2 直接使用 mongo cli指令
如果想直接在宿主机上使用mongoDB,可以在docker run 指令后加入 entrypoint指令,这样就可以直接进入mongo cli了:
$ docker run -it --link mymongo:db --entrypoint mongo mongo --host db
> db.version();
> db.stats();
> show dbs
还可以使用–storageEngine 参数来设置存储引擎:
$ docker run --name mymongodb -d mongo --storageEngine wiredTiger
2 使用自定义Dockerfile
2.1 准备工作
2.1.1 新建工作目录mongodb,并在目录下创建Dockerfile
$ mkdir ~/mongodb && cd ~/mongodb
$ touch Dockerfile
Dockerfile 内容如下:
# 设置从之前创建的ssh 镜像集成
FROM myubuntu:myssh
MAINTAINER kevin <kevin@163.com>
RUN apt-get update && \
apt-get install -y mongodb pwgen && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 创建mongoDB 存放数据文件的文件夹
RUN mkdir -p /data/db
VOLUME /data/db
# 启用mongodb 数据库登录身份验证
ENV AUTH yes
# 添加脚本
COPY start-mongodb.sh /start-mongodb.sh
COPY set_mongodb_password.sh /set_mongodb_password.sh
RUN chmod 755 /*.sh
EXPOSE 27017
CMD ["/start-mongodb.sh"]
2.1.2 创建set_mongodb_password.sh脚本,此脚本负责配置数据库的用户名和密码
#!/bin/bash
# 脚本用来设置数据库的用户名和密码
# 判断是否已经设置过密码
if [ -f /.mongodb_password_set ]; then
echo "MongoDB password already set!"
exit 0
fi
/usr/bin/mongod --nojournal &
# ${varname:-word},如果varname存在且非null,则返回其值;否则,返回word。用途:如果变量未定义,则返回默认值。可参考https://blog.csdn.net/flowingflying/article/details/5047415
:'
pwgen生成的密码易于记忆且相当安全。从技术上来说,容易记忆的密码不会比随机生成的密码更加安全。但是,在大多数情况下,pwgen生成的密码已经足够安全,除了网银密码等需要高安全等级的情况外。使用易于记忆的密码的好处就是你不会把这些密码写下来或者存到电脑上的某个地方,这样做本来就是不安全的。
安装:
apt-get install pwgen
语法:
pwgen [ OPTION ] [ pw_length ] [ num_pw ]
参数:
-c or –capitalize
密码中至少包含一个大写字母
-A or –no-capitalize
密码中不包含大写字母
-n or –numerals
密码中至少包含一个数字
-0 or –no-numerals
密码中不包含数字
-y or –symbols
密码中至少包含一个特殊符号
-s or –secure
生成完全随机密码
-B or –ambiguous
密码中不包含歧义字符(例如1,l,O,0)
-H or –sha1=path/to/file[#seed]
使用SHA1 hash给定的文件作为一个随机种子
-C
在列中打印生成的密码
-1
不要在列中打印生成的密码,即一行一个密码
-v or –no-vowels
不要使用任何元音,以避免偶然的脏话
例子:
生成长度8,含有数字,含有大小写字母的密码**4**个,**列**打印
pwgen -ncC 8 4
IGhoo0Oh Thex7AeS Ir9xaera Ahngi6Ee
生成长度8,含有数字,含有小写字母,不包含歧义的密码4个,列打印
pwgen -nABC 8 4
yaew4aph roof3sho ooyoo3oh soo9coah
生成长度16,含有数字,含有大小写字母,含有特殊字符的密码8个,**行**打印
pwgen -ncy1 16 8
egh5iehoo7Keiqu/
ooC8quaiteof+een
Uyieithobu^u1Ap9
yuqu=oQuoFie6Gof
shi9ohS<eid9phae
ahquai*gah6quaiF
ohSh*iqueeL4il6o
rai7oeij-ah1Deis
'
PASS=${MONGODB_PASS:-$(pwgen -s 12 1)}
_word=$( [ ${MONGODB_PASS} ] && echo "preset" || echo "random" )
RET=1
# 批量注释
:<<MULTILINECOMMENT
...注释的内容
...注释的内容
其中,MULTILINECOMMENT可以随意命名,只要别跟中间的注释内容混淆即可。
shell一旦遇到:<<MULTILINECOMMENT,就不执行脚本了,一直到再碰到MULTILINECOMMENT后重新开始执行脚本
如果忘记写MULTILINECOMMENT或者写错(由于已经不执行脚本了,所以即使写错也不会报错),则:<<MULTILINECOMMENT之后的脚步将都不会执行。
MULTILINECOMMENT
:<<!
-eq //等于;
-ne //不等于;
-gt //大于(greater );
-lt //小于(less);
-ge //大于等于;
-le //小于等于
[[ ]]是 Shell 内置关键字,它和 test 命令类似,也用来检测某个条件是否成立。
test 能做到的,[[ ]] 也能做到,而且 [[ ]] 做的更好;test 做不到的,[[ ]] 还能做到。可以认为 [[ ]] 是 test 的升级版,对细节进行了优化,并且扩展了一些功能。
[[ ]] 的用法为:
[[ expression ]]
当 [[ ]] 判断 expression 成立时,退出状态为 0,否则为非 0 值。注意[[ ]]和expression之间的空格,这两个空格是必须的,否则会导致语法错误。
!
# 判断服务是否成功启动
while [[ RET -ne 0 ]]; do
echo "=> Waiting for confirmation of MongoDB service startup"
sleep 5
# --eval arg evaluate javascript,即登录mongoshell后操作的指令
mongo admin --eval "help" > /dev/null 2>&1
# $? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值。所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1,这和C语言的 main() 函数是类似的。
RET=$?
done
# 通过docker logs + id 可以看到下面的输出
# echo "=> Createing an admin user with a ${_word} password in MongoDB"
# 设置mongo 数据库用户密码,并分配权限
mongo admin --eval "db.addUser({user: 'admin', pwd: '$PASS', roles: [ 'userAdminAnyDatabase', 'dbAdminAnyDatabase' ]});"
# 关闭mongo数据库
mongo admin --eval "db.shutdownServer();"
echo "=>Done!"
touch /.mongodb_password_set
echo "========================================================================="
echo "You can now connect to this MongoDB server using:"
echo ""
echo " mongo admin -u admin -p $PASS --host <host> --port <port> "
echo ""
echo "Please remember to change the above password as soon as possible!"
echo "========================================================================="
2.1.3 新建start-mongo.sh脚本,此脚本是主要的mongoDB启动脚本
#!/bin/bash
# 判读是否建立mongo用户密码,如果未创建,则执行创建脚本
if [ ! -f /.mongodb_password_set ]; then
/set_mongodb_password.sh
fi
# 判断是否设置密码登录环境变量,如果设置,则设置密码登录的mongo启动环境变量,否则配置正常启动环境变量
if [ "${AUTH}" == "yes" ]; then
# 可以自定义MongoDB的启动参数,并注意不同版本的mongo对启动参数的取舍。
export mongodb='/usr/bin/mongod --nojournal --auth'
else
export mongodb='/ust/bin/mongod --nojournal'
fi
# 判断是否存在mongo的lock文件,如果不存在,则直接执行启动mongo的命令,否则删除该文件,再执行启动命令
if [ ! -f /data/db/mongod.lock ]; then
eval $mongodb
else
export mongodb=$mongodb' --dbpath /data/db'
rm -f /data/db/mongod.lock
# 使用repair修复mongodb非正常关闭导致的问题,再执行启动mongo服务,参考http://blog.itpub.net/26995414/viewspace-733012/
mongod --dbpath /data/db --repair && eval $mongodb
fi
2.2 构建镜像
$ docker build -t mymongo .
2.3 启动容器
$ docker run --name my-mongo -d -p 27017:27017 mymongo
# 使用docker logs 查看默认的admin账号密码
$ docker logs my-mongo
=====================================================================
You can now connet to this MongoDB server using:
mongo admin -u admin -p S3npuUdRSFNV --host <host> --port <port>
Please remember to change the above password as soon as possible!
=====================================================================
屏幕输出的 S3npuUdRSFNV 就是admin的密码,也可以使用环境变量在容器启动时指定密码
$ docker run -d -p 27017:27017 -e MONGODB_PASS="mypass" mymongo
甚至可以不需要设置密码
$ docekr run -d -p 27017:27017 -e AUTH=no mymongo
3 mongoDB 的启动参数
由于mongodb 不同版本的启动参数有相应的取舍,具体需按照实际使用的版本进行参数选择,以下列举了mongo 3.2.6 版本的启动参数:
参数 | 作用 |
---|---|
–quiet | 安静输出,去除多余输入内容 |
–port arg | 指定服务端口号,默认端口27017 |
–bind_ip arg | 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP |
–logpath arg | 指定mongodb日志文件,注意是指定文件不是目录 |
–logappend | 使用追加的方式写日志 |
–pidfilepath arg | PID File 的完整路径,如果没有设置,则没有PID文件 |
–keyFile arg | 集群的私钥的完整路径,只对于Replica Set 架构有效 |
–unixSocketPrefix arg | Unix域套接字替代目录(默认 /tmp) |
–fork | 以守护进程的方式运行MongoDB,创建服务器进程 |
–auth | 启用验证 |
–cpu | 指定显示CPU的利用率和iowait |
–dbpath arg | 指定数据库路径 |
–diaglog arg | diaglog 选项:0=off,1=W,2=R,3=both,7=W+some reads |
–directoryperdb | 设置每个数据库将被保存在一个单独的目录 |
–journal | 启用日志选项,MongoDB的数据操作将会写入到journal 文件夹的文件里 |
–journalOptions arg | 启用日志诊断选项 |
–ipv6 | 启用ipv6选项 |
–jsonp | 允许jsonp形式通过HTTP 访问(有安全影响) |
–maxConns arg | 最大同时连接数,默认2000 |
–noauth | 不启用验证 |
–nohttpinterface | 关闭HTTP接口,默认关闭27018端口访问 |
–noprealloc | 禁用数据文件预分配(往往影响性能) |
–noscripting | 禁用脚本引擎 |
–notablescan | 不允许表扫描 |
–nounixsocket | 禁用unix套接字监听 |
–nssize arg (=16) | 设置信数据库.ns文件大小(MB) |
–objcheck | 在收到客户数据,检查有效性 |
–profile arg | 档案参数:0=off, 1=slow, 2=all |
–quota | 限制每个数据库的文件数,设置默认为8 |
–quotaFiles arg | 限制单个数据库允许的文件 |
–rest | 开启简单的Rest API |
–repair | 修复所有数据库,如 run repair on all dbs |
–repairpath arg | 修复生成的文件目录,默认为目录dbpath |
–slowms arg (=100) | profile和日志输出延迟 |
–smallfiles | 使用较小的默认文件 |
–syncdelay arg (=60) | 数据写入磁盘的时间秒数(0=never,不推荐) |
–sysinfo | 打印一些诊断系统信息 |
–upgrade | 升级数据库,* Replication 参数 |
– | – |
–fastsync | 从一个dbpath 里启用从库复制服务,该dbpath的数据库是主库的快照,可用于快速启用同步 |
–autoresync | 如果从库与主库同步数据差的多,自动重新同步 |
–oplogSize arg | 设置oplog 的大小(MB),* 主/从参数 |
– | – |
–maser | 主库模式 |
–slave | 从库模式 |
–source arg | 从库端口号 |
–only arg | 指定单一的数据库复制 |
–slavedelay arg | 设置从库同步主库的延迟时间,* Replica set(副本集)选项 |
– | – |
–replSet arg | 设置副本集名称,* Sharding(分片)选项 |
– | – |
–configsvr | 声明这是一个集群的config服务,默认端口27019,默认目录/data/configdb |
–shardsvr | 声明这是一个集群的分片,默认端口27018 |
–noMoveParanoia | 关闭偏执为moveChunk数据保存 |
上述参数可以直接在mongod.conf 配置文件中配置(高版本已使用yml文件进行配置),例如:
dbpath = /data/mongodb
logpath = /data/mongodb/mongodb.log
logappend = true
port = 27017
fork = true
auth = true
4 相关资源
MongoDB 相关资源如下:
MongoDB 官网:https://www.mongodb.org
MongoDB 官方镜像: https://hub.docker.com/_/mongo/
MongoDB 官方镜像实现:https://github.com/docker-library/mongo