查看几十篇教程,折腾了一天半,终于成功!
第一次部署完成后迅速试了一下数据库的同步功能,发现三个数据库可以正常的同步,非常开心;后来发现,这居然不需要用密码!明明设置了用户名密码,但是就算不填也可以访问数据库,这要是部署出去,还不立马完蛋。
之前被小弟狠狠的坑了一把,没有设置数据库的密码,本来以为限制IP访问就万事大吉,后来由于需要,把IP开了出来,结果没过半天,数据库里的数据就被删了,对方还留下了一个比特币账号要求打钱,还好那个数据库只是个测试库,里面的数据并不重要。
废话不多说了,搞技术的就一个字:干
首先是docker相关的内容,大家可以移步这里,官方文档,如何通过docker去拉镜像,如何装docker等,这里就不多说了,大家自己看教程
Docker 安装 MongoDB | 菜鸟教程 (runoob.com)
镜像拉到之后,剩下的就是容器的相关操作,咱们重点来这方面的内容,当然,我也不是看官方文档的,我参考的是一篇前辈的文章:
(35条消息) Docker MongoDB 最简单副本集(集群) (客户端验证密码 - 集群内部使用mongodbKeyfile验证 ) 部署_xoppen的博客-CSDN博客
在服务器里面创建文件夹
在 root 文件夹下 创建 三个文件夹 分别是 mongo0,mongo1,mongo2。
再这 三个文件夹里分别 创建文件夹 configdb,db。 然后在文件夹 configdb 里创建文件 mongod.conf
net:
port: 27017 # 这是启动端口
bindIp: 0.0.0.0 # 允许哪些ip连接(好像和下面的命令参数 --bind_ip_all 相类似的作用)
systemLog:
logAppend: true # 重新启动的mongodb的时候日志拼接在以前的日志文件上,不用新建
security:
keyFile: "/data/configdb/mongodbKeyfile.key" # 这个路径很重要(注意这个路径是下面容器映射过的路径)
clusterAuthMode: "keyFile"
#authorization: "enabled" # 开启客户端连接验证(这行我先注释掉了)
replication:
replSetName: "mongoRs" # 副本集的名称
里面那个Key文件是通过命令生成的
openssl rand -base64 756 > /root/mongo0/configdb/mongodbKeyfile.key
cp /root/mongo0/configdb/mongodbKeyfile.key /root/mongo1/configdb
cp /root/mongo0/configdb/mongodbKeyfile.key /root/mongo2/configdb
chmod 400 /root/mongo0/configdb/mongodbKeyfile.key
chmod 400 /root/mongo1/configdb/mongodbKeyfile.key
chmod 400 /root/mongo2/configdb/mongodbKeyfile.key
重点来了,把这个key文件拷贝到另外两个mongo1 ,mongo2相同的目录下面
然后前期工作已经准备妥当了,开始主题吧!
docker run -di --name=mongo0 -p 37017:27017 -v /root/mongo0/configdb:/data/configdb/ -v /root/mongo0/db/:/data/db/ 你的镜像名或镜像id --replSet "mongoRs" --bind_ip_all -f /data/configdb/mongod.conf
docker run -di --name=mongo1 -p 47017:27017 -v /root/mongo1/configdb:/data/configdb/ -v /root/mongo1/db/:/data/db/ 你的镜像名或镜像id --replSet "mongoRs" --bind_ip_all -f /data/configdb/mongod.conf
docker run -di --name=mongo2 -p 57017:27017 -v /root/mongo2/configdb:/data/configdb/ -v /root/mongo2/db/:/data/db/ 你的镜像名或镜像id --replSet "mongoRs" --bind_ip_all -f /data/configdb/mongod.conf
这里主要配置是docker对于mongodb的映射,mongoRs是副本集的名字,还有端口号相关的映射
好了之后通过
docker ps -a
就可以看到容器启动的情况,正常情况下是应该都起来了
我们随意进入一个容器
docker exec -it mongo0 mongo admin
然后进行初始化:
rs.initiate({_id:"mongoRs", members:[{_id:0,host:"xxx.xxx.xxx.xxx:37017"},{_id:1,host:"xxx.xxx.xxx.xxx:47017"},{_id:2,host:"xxx.xxx.xxx.xxx:57017"}]});
然后集群创建成功!!!
但是这个时候数据库是没有验证就可以登录的,我们需要设置用户名密码
db.createUser({ user:'admin',pwd:'password',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
然后通过工具连接数据库发现三个数据库都需要密码才能连接了,至此,mongodb 3节点副本集配置完毕,其实会了以后觉得特别简单,现在10分钟我就能搭一个了