本文共 5605 字,大约阅读时间需要 18 分钟。
docker run \--name mymongo \-p 27017:27017 \-v /usr/local/docker/mongo/config:/data/configdb/ \-v /usr/local/docker/mongo/data:/data/db/ \-v /usr/local/docker/mongo/backup/data:/data/backup \-v /usr/local/docker/mongo/backup/data_tar:/data/backup_tar \--restart=always \-d mongo:3.4 --auth说明:/usr/local/docker/mongo/config 容器映射到主机的配置文件夹/usr/local/docker/mongo/data 容器映射到主机的数据文件夹/usr/local/docker/mongo/backup/data 容器映射到主机的最近一次备份数据(未打包)/usr/local/docker/mongo/backup/data_tar 容器映射到主机的最近7天备份的数据(已打包)--auth 开启访问认证
# 以admin的身份进入容器docker exec -it containerID/containerName mongo admin# 创建用户,并添加密码db.createUser({ user: 'admin', pwd: 'admin123456', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });# 尝试认证用户db.auth("admin","admin123456")# 另外创建一个用户db.createUser({ user: 'test', pwd: 'test123456', roles: [ { role: "readWrite", db: "test" } ] });# 现在给用户授权,这里是给用户授权 参数依次是 用户名,角色[这里用的是系统自带角色], 数据库名# 添加读写的角色db.grantRolesToUser("admin", [ { role: "readWrite", db: "admin" } ])# 添加备份角色db.grantRolesToUser("admin", [ { role: "backup", db: "admin" } ])# 添加恢复角色db.grantRolesToUser("admin", [ { role: "restore", db: "admin" } ])# 查看所有用户show users# 退出操作exit
这是mongodb数据库自带角色及其说明:
(1).数据库用户角色针对每一个数据库进行控制。read :提供了读取所有非系统集合,以及系统集合中的system.indexes, system.js, system.namespacesreadWrite: 包含了所有read权限,以及修改所有非系统集合的和系统集合中的system.js的权限.(2).数据库管理角色每一个数据库包含了下面的数据库管理角色。dbOwner:该数据库的所有者,具有该数据库的全部权限。dbAdmin:一些数据库对象的管理操作,但是没有数据库的读写权限。userAdmin:为当前用户创建、修改用户和角色。拥有userAdmin权限的用户可以将该数据库的任意权限赋予任意的用户。(3).集群管理权限admin数据库包含了下面的角色,用户管理整个系统,而非单个数据库。这些权限包含了复制集和共享集群的管理函数。clusterAdmin:提供了最大的集群管理功能。相当于clusterManager, clusterMonitor, and hostManager和dropDatabase的权限组合。clusterManager:提供了集群和复制集管理和监控操作。拥有该权限的用户可以操作config和local数据库(即分片和复制功能)clusterMonitor:仅仅监控集群和复制集。hostManager:提供了监控和管理服务器的权限,包括shutdown节点,logrotate, repairDatabase等。备份恢复权限:admin数据库中包含了备份恢复数据的角色。包括backup、restore等等。(4).所有数据库角色admin数据库提供了一个mongod实例中所有数据库的权限角色:readAnyDatabase:具有read每一个数据库权限。但是不包括应用到集群中的数据库。和read相似,但它是全局。的。readWriteAnyDatabase:具有readWrite每一个数据库权限。但是不包括应用到集群中的数据库。userAdminAnyDatabase:具有userAdmin每一个数据库权限,但是不包括应用到集群中的数据库。dbAdminAnyDatabase:提供了dbAdmin每一个数据库权限,但是不包括应用到集群中的数据库。(5). 超级管理员权限root: dbadmin到admin数据库、useradmin到admin数据库以及UserAdminAnyDatabase。但它不具有备份恢复、直接操作system.*集合的权限,但是拥有root权限的超级用户可以自己给自己赋予这些权限。(6). 备份恢复角色:backup、restore;(7). 内部角色:__system
https://docs.mongodb.com/manual/tutorial/enable-authentication/
# 进入容器docker exec -it containerID/containerName /bin/bash# 编辑配置文件vi /etc/mongod.conf.orig# 若没有安装vim请 安装vimapt-get updateapt-get install vim# 这是定时任务,暂时不用apt-get -y install cron
在配置文件 /etc/mongo.conf 中加入开启认证:
security: authorization: enabled
**注意:**这里备份时候需要 此用户有系统自带的 【备份和恢复】 的角色
开启备份的backup-db.sh脚本:
#!/bin/bashsource /etc/profile# 主机的备份日志LOG_DIR=/usr/local/docker/mongo/backup/log# 远程服务器ipREMOTE_IP=114.0.0.0# 远程服务器用户REMOTE_USER=root# 远程服务器备份目录REMOTE_DIR=/usr/data# 主机上备份压缩文件目录BACK_DIR=/usr/local/docker/mongo/backup/data_tar# mongodb容器的名称CONTAINERNAME=mymongo# 进入容器# 容器内的文件夹OUT_DIR=/data/backup# 容器内打包的备份文件TAR_DIR=/data/backup_tarfunction log(){ echo "[ `date '+\%Y-\%m-\%d \%H:\%M:\%S'` ] $1"}# 备份function main(){DATE=`date +\%Y\%m\%d\%H\%M\%S`DB_USER=adminDB_PASS=admin123456DAYS=7TAR_BAK="mongod_bak_$DATE.tar.gz"# 注意这里有坑,不要用 -it ,需要把 t 去掉否则在执行脚本的时候 会报错 the input device is not a TTYdocker exec -i $CONTAINERNAME /bin/bash -c 'cd $OUT_DIR'log "删除上一次的数据"docker exec -i $CONTAINERNAME /bin/bash -c 'rm -rf $OUT_DIR'log "容器中开始备份 ${TAR_BAK}"docker exec -i $CONTAINERNAME mongodump -h 127.0.0.1:27017 -u $DB_USER -p $DB_PASS -d admin -o $OUT_DIRlog "容器中开始打包 ${TAR_BAK}"docker exec -i $CONTAINERNAME tar -zcvf $TAR_DIR/$TAR_BAK $OUT_DIRlog "主机开始远程备份 ${TAR_BAK}"scp $BACK_DIR/$TAR_BAK $REMOTE_USER@$REMOTE_IP:$REMOTE_DIRlog "备份到远程成功"log "开始删除7天前的备份"find $BACK_DIR/ -mtime +$DAYS -deletelog "删除完毕"}main >> ${LOG_DIR}/backup.log 2>&1
注意:
若是在Windows上编辑过脚本,上传脚本后,需要执行以下命令,清除脚本中的空格和换行
# 去除脚本中的空格和换行sed -i 's/\r$//' /usr/local/docker/mongo/backup/backup-db.sh# 脚本中docker主机执行中执行容器命令时候 docker exec -it 需要将 t 去掉,否则在执行定时任务脚本的时候会报错 the input device is not a TTY
定时执行脚本备份:
利用 linux 系统自带的 crontab 定时任务,每天定时执行以上脚本。
新建定时任务:
$ crontab -e
在最后一行写上:
# 每日凌晨2点,执行相应脚本0 2 * * * /bin/bash /usr/local/docker/mongo/backup/backup-db.sh
定时任务参数部分说明:
**加入开机自动启动:**chkconfig –level 35 crond on
crontab -e # 创建自己的一个任务调度,此时会进入到vi编辑界面,来编写我们要调度的任务
crontab -l # 列出定时的任务
crontab -r con_name # 删除crontab文件
which ifconfig # 获取命令路径
服务操作说明:
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
/sbin/service crond status //启动服务
将之前备份的数据拷贝到 容器内部 备份文件夹:
mongorestore -h IP:port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件存在路径--drop:先删除所有的记录,然后恢复.【drop慎用】docker exec -it/ mongorestore -h IP:port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件存在路径# 执行命令恢复 docker exec -it mymongo mongorestore -h 127.0.0.1:27017 -u admin -p admin123456 -d admin --dir /data/backup/admin
# 容器内备份的文件夹/data/backup/admin
>mongorestore -h<:port> -d dbname -h <:port>:MongoDB所在服务器地址,默认为: localhost:27017--db , -d :需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2--drop:恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦! :mongorestore 最后的一个参数,设置备份数据所在位置,例如:/data/backup/admin你不能同时指定 和 --dir 选项,--dir也可以设置备份目录。--dir:指定备份的目录你不能同时指定 和 --dir 选项新建mongodb数据库smp_maint_2_restore,然后执行如下命令:mongorestore -h 192.168.1.18:27017 -d smp_maint_2_restore --dir E:\data\home\momgodump\smp_maint_2
``
转载地址:http://vhxxi.baihongyu.com/