前言
折腾一些使用docker来配置和管理mongodb和mongodb集群。
安装mongodb
从docker网站拉取mongodb镜像
docker search mongo
# 选择一个版本
docker pull mongo:3.4
# 查看拉取的版本
docker images
配置相关参数
- 宿主机创建mongo文件夹
cd /mnt/
mkdir mongodb
cd ./mongodb
mkdir data # 放置数据文件
mkdir backup # 备份文件
mkdir conf # 配置文件
- 创建mongodb配置文件
# mongodb.conf
logappend=true
# bind_ip=127.0.0.1
port=27017
fork=true
noprealloc=true
auth=true
创建内部网络
docker network create tms
创建容器
docker run --name mongodb -v /mnt/mongodb/data:/data/db -v /mnt/mongodb/backup:/data/backup -v /mnt/mongodb/conf:/data/configdb -p 27018:27017 --network tms --network-alias mongodb -d mongo --auth
# 容器命名mongodb,数据库数据文件挂载到/mnt/mongodb/data,备份文件挂载到/mnt/mongodb/backup,启动的配置文件目录挂载到容器的/data/configdb,--auth开启身份验证。
# 如果想要使用配置文件启动mongodb,则执行自己的启动命令:
docker run --name mongodb -v /mnt/mongodb/data:/data/db -v /mnt/mongodb/backup:/data/backup -v /mnt/mongodb/conf:/data/configdb -p 27018:27017 --network tms --network-alias mongodb -d mongo mongod -f /data/configdb/mongodb.conf
记住:自己的mongod启动命令是在容器内执行的,因此使用的配置文件路径是相对于容器的内部路径。
之所以要挂载数据卷是为了便于直接对数据库数据进行读取以及备份的方便,当然也可以不挂载,挂载的主要目的一般是为了挂载应用的启动配置文件。
进入容器创建用户
docker exec -it mongodb bash
use admin
db.createUser({ # 先创建root用户
user:\'admin\',
pwd:\'123456\',
roles:[{role:\'root\',db:\'admin\'}],
})
db.auth(\'admin\',\'123456\') # 认证
# 然后创建普通用户
退出容器后我们可以尝试在主机访问容器里的mongodb,如果出现如下错误:
Error: 18 { ok: 0.0, errmsg: "auth failed", code: 18, codeName: "AuthenticationFailed" }
可能的一个原因是mongo的客户端版本太低,不支持认证操作,将mongo的客户端升级后再次尝试。
mongodb副本集
一个最小的副本集为3个成员,包括主节点,备节点和仲裁节点,如果没有仲裁节点,备节点是不会自动升级为主节点的。
创建mongodb节点
# 创建一个网络
docker network create tms
docker run --name m1 -p 27001:27017 --network tms --network-alias m1 -d mongo:3.4 --replSet mset --bind_ip 0.0.0.0
docker run --name m2 -p 27002:27017 --network tms --network-alias m2 -d mongo:3.4 --replSet mset --bind_ip 0.0.0.0
docker run --name m3 -p 27003:27017 --network tms --network-alias m3 -d mongo:3.4 --replSet mset --bind_ip 0.0.0.0
注意一定要将bind_ip设置成不是只有本地访问,否则副本集不能初始化成功。
配置节点
rs.initiate({ _id:"mset", members:[
{_id:0,host:"m1:27017",priority:2}, {_id:1,host:"m2:27017",priority:1}, {_id:2,host:"m3:27017",arbiterOnly:true}
]})
priority:设置优先级,数字越大优先级越高,优先级最高的是主节点
rs.status() # 查看状态
# 默认备份节点不能读写,可以设置
rs.slaveOk();
# 增加节点,需要进入主节点执行
rs.add(\'ip:port\')
创建用户
use admin
db.createUser({
user:\'admin\',
pwd:\'123456\',
roles:[{role:\'root\',db:\'admin\'}],
})
db.auth(\'admin\',\'123456\')
开启认证
如果需要开启认证,使用ssl的keyfile文件作为认证文件:
openssl rand -base64 666 > mongodb.key # 生成认证文件
chmod 600 mongodb.key # 设置执行权限
- 设置配置文件
# /mnt/mongodb/mconf/mongod.conf
net:
port: 27017
bindIp: 0.0.0.0
systemLog:
logAppend: true
processManagement:
fork: false
security:
keyFile: "/data/configdb/mongodb.key"
clusterAuthMode: "keyFile"
authorization: "enabled"
replication:
replSetName: "mset"
secondaryIndexPrefetch: "all"
- 启动容器
docker run --name m1 -p 27001:27017 -v /mnt/mongodb/mconf:/data/configdb --network tms --network-alias m1 -d mongo:3.4 mongod -f /data/configdb/mongod.conf
docker run --name m2 -p 27002:27017 -v /mnt/mongodb/mconf:/data/configdb --network tms --network-alias m2 -d mongo:3.4 mongod -f /data/configdb/mongod.conf
docker run --name m3 -p 27003:27017 -v /mnt/mongodb/mconf:/data/configdb --network tms --network-alias m3 -d mongo:3.4 mongod -f /data/configdb/mongod.conf