windows的docker desktop搭建MongoDB副本集

创建网络
docker network create mongo-cluster

创建容器
docker run -d --name mongo1 --net mongo-cluster -v D:/mongodb/data/mongo1:/data/db -p 27017:27017 mongo:4.0 --replSet "rs0"
docker run -d --name mongo2 --net mongo-cluster -v D:/mongodb/data/mongo2:/data/db -p 27018:27017 mongo:4.0 --replSet "rs0"
docker run -d --name mongo3 --net mongo-cluster -v D:/mongodb/data/mongo3:/data/db -p 27019:27017 mongo:4.0 --replSet "rs0"

进入任意节点
docker exec -it mongo1 mongo

docker容器内部可以访问,副本集的配置
rs.initiate(
  {
    _id : 'rs0',
    members: [
      { _id: 0, host: "mongo1:27017" },
      { _id: 1, host: "mongo2:27017" },
      { _id: 2, host: "mongo3:27017" }
    ]
  }
)

查看状态
rs.status()

进入主节点,创建用户账号密码,用于在应用程序MongoDB compass中访问
主节点的账号密码会自动复制到其他节点
db.createUser({
    user: "admin",
    pwd: "123456",
    roles: [{ role: "root", db: "admin" }]
})

在MongoDB compass中输入mongodb://admin:123456@localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0&authSource=admin

错误消息"getaddrinfo ENOTFOUND mongo2"表明MongoDB Compass在解析主机名"mongo2"时出现问题。

起初以为是需要设置为

  _id: 'rs0',
  members: [
    { _id: 0, host: "localhost:27017" },
    { _id: 1, host: "localhost:27018" },
    { _id: 2, host: "localhost:27019" }
  ]
});

如果这样设置会导致三个节点之间无法通信,在Docker容器内部运行MongoDB时,使用localhost并不指向你的宿主机(Windows 系统),而是指向容器本身的内部网络环境。

mongo1容器中执行rs.initiate()并尝试连接到localhost:27018localhost:27019时,它实际上是在尝试连接mongo1容器自己的2701827019端口,而这些端口并没有被使用。

因此不需要改动,依然使用mongo1、mongo2、mongo3,在容器内部通信是可以的。

从宿主机或任何不在Docker网络中的客户端连接副本集时,应该使用宿主机的地址(localhost)和映射到的端口号。

重要

具有管理员权限的文本编辑器打开"C:\Windows\System32\drivers\etc\hosts"文件。

127.0.0.1 mongo1 mongo2 mongo3

设置完可以连接了。

端口映射将本地主机上的流量重定向到容器内的MongoDB服务,通过本地主机的localhost访问MongoDB容器时,本地主机的DNS解析可能无法识别这些容器内的主机名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值