注意:我的镜像名是mongo:latest,需要根据你镜像名更改
docker run --name mongo01 -p 27027:27017 mongo:latest mongod --replSet rs0 --bind_ip_all
docker run --name mongo02 -p 27028:27017 mongo:latest mongod --replSet rs0 --bind_ip_all
docker run --name mongo03 -p 27029:27017 mongo:latest mongod --replSet rs0 --bind_ip_all
进入C:\Windows\System32\drivers\etc\hosts 以文本形式打开
找到192.168.31.52 host.docker.internal这一栏,我们单服务器用docker部署副本集一定要以这个作为主机名
我们进入mongo01容器
docker exec -it mongo01 /bin/bash
在mongo01容器内连接mongo服务,注意我的是192.168.31.52,你要改成你的
mongosh "mongodb://192.168.31.52:27027"
一定要仔细看清有没有报MongoNetworkError错误,如果报错说明你的地址错误,ip这个不能错,去C:\Windows\System32\drivers\etc\hosts里面找你的host.docker.internal这一栏
初始化副本集
rs.initiate({
_id: "rs0",
version: 1,
members: [
{ _id: 0, host: "192.168.31.52:27027" },
{ _id: 1, host: "192.168.31.52:27028" },
{ _id: 2, host: "192.168.31.52:27029" }
]
});
如果报{ok: 1}说明部署成功,下面用navicat连接
mongodb://192.168.31.52:27027,192.168.31.52:27028,192.168.31.52:27029/?replicaSet=rs0
docker部署mongo服务,尤其是mongo副本集,坑极其多,你问大模型或者相应的文章,都告诉你创建Docker 网络进行容器之间的通信,这种确实可以部署,但因为我们无法访问docker容器内部,只能通过端口映射,所以我们部署的mongo副本集用navicat、mongoDB等软件死活连不上,只能直连某一个容器
我们为什么要用192.168.31.52:27027作为主机名?
1. mongo01可以被其他容器识别,但我们访问不到,所以mongodb://mongo01:27017,mongo02:27017,mongo03:27017/?replicaSet=rs0我们是连接不上的,即使我们在hosts配置了127.0.0.1 mongo01 、127.0.0.1 mongo02、127.0.0.1 mongo03
2. localhost我们访问的到,mongodb://localhost:27027我们也能连接,这是因为localhost:27027映射了容器mogno01的27017端口,但是mongodb://localhost:27027,localhost:27028,localhost:27029/?replicaSet=rs0我们也是连接不上的,因为容器无法相互识别
我们可以取一个中间量192.168.31.52,这个既能被本机所访问,又能被容器访问,所以我们可以在容器内部署,并且我们还能使用navicat、mongoDB等软件连接
(云服务器集群上部署副本集,每个服务器都是有公网ip的,不需要我们这样还要扒出来docker主机网络,所以本文主要就是提供一种单服务器使用docker部署mongo副本集的思路,仅供参考;或者你只有一台服务器,还想用docker部署mongo副本集)
如果有好的方法,欢迎大家来讨论!