Docker中搭建Mongo副本集 实现数据库的事务处理
在Docker中安装 Mongo
拉取镜像
docker pull mongo:latest
创建网络组,用于固定这几个容器的IP,防止计算器或者Docker重启后,导致IP变动,副本集关联失败.
docker network create --subnet=172.19.0.0/16 mongo-cluster
创建3个 实例
docker run --net mongo-cluster --ip 172.19.0.2 -p 27017:27017 --name mongo1 -d mongo --replSet rs0
docker run --net mongo-cluster --ip 172.19.0.3 -p 27018:27017 --name mongo2 -d mongo --replSet rs0
docker run --net mongo-cluster --ip 172.19.0.4 -p 27019:27017 --name mongo3 -d mongo --replSet rs0

进入 实例容器 配置副本集
docker exec -it mongo1 mongosh
然后,将上面 docker inspect 获得的3个实例ip ,替换下面代码的ip,对副本集初始化.
rs.initiate({ "_id": "rs0", "members": [{ "_id": 0,"host": "172.19.0.2:27017"}, { "_id": 1, "host": "172.19.0.3:27017"}, {"_id": 2,"host": "172.19.0.4:27017"}] })
完成初始化后,查看副本集是否正常.
rs.status()

在members 数组中将包含3 个对象.与初始化中提供的IP 端口一致.
把主集的优先级升到最高,防止重启Docker 或者计算机后主集和副集因为启动速度不同 而自动切换.
cfg = rs.conf()
cfg.members[0].priority = 100
rs.reconfig(cfg)
现在可以开始测试副本集是否自动同步.
docker exec -it mongodb01 #进入主集
mongosh #链接mongo
show dbs #查看数据表
use test #生成test表 并插入 测试数据
db.test.insert({name:"data1"})
db.test.find()

你将在主集实例中看到 插入的 第一条测试数据.
quit
从主集容器中退出,去到子集中 查看 是否已同步.
docker exec -it mongodb02 mongosh
use test
db.test.find()
你将会看到和主集相同的结果,或者出现这个错误.

解决方案:
rs.secondaryOk()
然后再
db.test.find()
如果得到更显再mongodb01中相同的记录,代表 副本集创建完成.
远程客户端连接服务器如果失败,记得请再连接字符串中加入:
directConnection=true
mongodb://127.0.0.1:27017/?directConnection=true