创建网络:
docker network create mongo-net
以副本方式启动三个mongo示例 复制集名称一定要相同
docker run --name mongo-server-28017 --net mongo-net -p 28017:27017 -v /mongodb/data1:/data/db -e mongo_initdb_root_username=root -e mongo_initdb_root_password=root -d mongo:4.4.10 --replSet rs0
docker run --name mongo-server-28018 --net mongo-net -p 28018:27017 -v /mongodb/data2:/data/db -e mongo_initdb_root_username=root -e mongo_initdb_root_password=root -d mongo:4.4.10 --replSet rs0
docker run --name mongo-server-28019 --net mongo-net -p 28019:27017 -v /mongodb/data3:/data/db -e mongo_initdb_root_username=root -e mongo_initdb_root_password=root -d mongo:4.4.10 --replSet rs0
上述命令中:
- 创建network不是必须的,主要是方便在容器中使用彼此的名称可以访问
- –name mongo-server-28017 指定容器名称
- –net mongo-net 指定同一个网络内
- -p 28017:27017 物理机端口:容器示例端口
- -v /mongodb/data1:/data/db 挂载目录
- -e mongo_initdb_root_username=root -e mongo_initdb_root_password=root 指定初始密码
- –replSet rs0 指定复制集名称(同一个复制集的名称必须相同)
// 进入容器内部
docker exec -it mongo-server-28017 bash
// 在主节点服务器上 连接到MongoDB
mongo --host localhost --port 27017 --shell
use admin
// 在shell中输入以下命令来创建一个具有足够权限的用户(这里我们使用"root"作为用户名和"password"作为密码)
db.createUser({user: "root", pwd: "root", roles: ["root"]})
// 然后,退出shell,并重新连接,这次使用新创建的用户进行验证
exit
mongo --host localhost --port 27017 --username root --password root --shell
// 初始化副本集
rs.initiate({_id: "rs0", members: [{_id: 0, host: "mongo-server-28017:27017"}, {_id: 1, host: "mongo-server-28018:27017"}, {_id: 2, host: "mongo-server-28019:27017"}]})
// 检查members属性
rs.status()
- rs.initiate 是初始化复制集的方法。
- {_id: “rs0”, members: […]} 是复制集的配置。其中,_id 是复制集的名称,members 是复制集的成员列表。
- {_id: 0, host: “mongo-server-28017:27017”} 是一个成员的配置,其中_id是成员的ID,host是该成员的地址和端口。
rs.reconfig({_id: "rs0", members: [{_id: 0, host: "mongo-server-28017:27017"}, {_id: 1, host: "mongo-server-28018:27017"}, {_id: 2, host: "mongo-server-28019:27017"}]},{force:true})
- rs.reconfig 是重新配置复制集的方法。
- {_id: “rs0”, members: […]} 是新的复制集配置。其中,_id 是复制集的名称,members 是复制集的成员列表。
- {_id: 0, host: “mongo-server-28017:27017”} 是一个成员的配置,其中_id是成员的ID,host是该成员的地址和端口。
- {force: true} 是一个可选参数,当设置为true时,它将会强制重新配置复制集,即使这个操作可能会导致数据丢失或服务中断。
// MongoDB 主节点进行写入
mongo --port 28017
rs0:PRIMARY> db.user.insert([{name:"fox"},{name:"mongo"}])
// MongoDB 从节点进行读
mongo --port 28018
rs0:SECONDARY> rs.secondaryOk()
rs0:SECONDARY> db.user.find()
查看当前节点角色:
db.isMaster()
// 如果安装有问题,使用以下命令卸载重装
docker stop mongo-server-28017 mongo-server-28018 mongo-server-28019
docker rm mongo-server-28017 mongo-server-28018 mongo-server-28019