Mongodb在docker容器中的集群部署

1.拉取镜像

docker pull mongo

2.创建网络

docker network create mongo-rs

3创建容器

docker run --rm --network mongo-rs  --name mongo1 -d -v /data/mongo1/db:/data/db -p 27021:27017 mongo:latest --replSet "rs0" 
docker run --rm --network mongo-rs  --name mongo2 -d -v /data/mongo2/db:/data/db -p 27022:27017 mongo:latest --replSet "rs0"
docker run --rm --network mongo-rs  --name mongo3 -d -v /data/mongo3/db:/data/db -p 27023:27017 mongo:latest --replSet "rs0"
docker run --rm --network mongo-rs  --name mongo4 -d -v /data/mongo4/db:/data/db -p 27024:27017 mongo:latest --replSet "rs0"
docker run --rm --network mongo-rs  --name mongo5 -d -v /data/mongo5/db:/data/db -p 27025:27017 mongo:latest --replSet "rs0"
docker run --rm --network mongo-rs  --name mongo6 -d -v /data/mongo6/db:/data/db -p 27026:27017 mongo:latest --replSet "rs0"

说明: 

  • -v 参数:将 docker 容器内部 /data/db 目录挂载在宿主机 /data/mongo4/db 目录,防止容器重启时,数据丢失
  • --network: 将 docker 容器划入 mongo-rs 网桥;
  • --replSet: 命名副本集名称为 rs0;

4.进入 mongo1 客户端

//进入客户端
docker exec -it mongo1 mongosh
//启动一个副本集(即采用 mongo1 作为主节点)
rs.initiate()
//新增副本节点
rs.add('mongo2:27017')
rs.add('mongo3:27017')
rs.add('mongo4:27017')
rs.add('mongo5:27017')
rs.add('mongo6:27017')

注意:

新版的使用:docker exec -it mongo1 mongosh --port 27021:.进入 mongo1 客户端。

旧版的使用:docker exec -it mongo1 mongo --port 27021:.进入 mongo1 客户端。

这个时候集群已经创建好啦!!!!

5.验证集群运作

在主节点 mongo1 添加一条数据:

replSet1:PRIMARY> db.car.insert({"name":"奥迪"})
WriteResult({ "nInserted" : 1 })

在从节点 mongo2 mongo3 查看数据是否同步:

replSet1:SECONDARY> rs.secondaryOk() // 先允许读取操作在从节点执行
replSet1:SECONDARY> db.car.find()
{ "_id" : ObjectId("605ca97350221c02825ceaa7"), "name" : "奥迪" }

6.部署完成后常用维护

//1.进入 mongo1 客户端:
docker exec -it mongo1 mongosh
//2.在 mongo shell 中执行以下命令 
rs.initiate() //启动一个副本集(即采用 mongo1 作为主节点)
rs.conf() //查看每个节点中 host、arbiterOnly、hidden、priority、 votes、slaveDelay等属性
rs.add('mongo2:27021') //新增节点
rs.remove('mongo2:27021') //删除节点
rs.status() //查看副本集状态

替换副本集节点

cfg = rs.conf()
cfg.members[0].host = "mongo1:27021"
rs.reconfig(cfg)