docker搭建mongo副本集(单服务器)

注意:我的镜像名是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副本集)

如果有好的方法,欢迎大家来讨论!

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Docker Compose部署MongoDB副本的示例: ```yaml version: '3' services: mongo1: image: mongo restart: always ports: - 27017:27017 volumes: - ./data1:/data/db command: mongod --replSet "mongoRs" mongo2: image: mongo restart: always ports: - 27018:27017 volumes: - ./data2:/data/db command: mongod --replSet "mongoRs" mongo3: image: mongo restart: always ports: - 27019:27017 volumes: - ./data3:/data/db command: mongod --replSet "mongoRs" mongo-init: image: mongo restart: on-failure depends_on: - mongo1 - mongo2 - mongo3 volumes: - ./init.js:/docker-entrypoint-initdb.d/init.js ``` 在上面的示例中,我们定义了三个MongoDB容器mongo1,mongo2和mongo3),每个容器都使用不同的端口并将其映射到主机上。每个容器都有自己的数据卷用于持久化数据。 我们还定义了一个mongo-init服务,它依赖于mongo1,mongo2和mongo3服务。该服务用于初始化副本。 在与Docker Compose文件相同的目录中,我们还需要创建一个名为init.js的文件,用于初始化副本。以下是一个示例init.js文件的内容: ```javascript rs.initiate({ _id: "mongoRs", members: [ { _id: 0, host: "mongo1:27017" }, { _id: 1, host: "mongo2:27017" }, { _id: 2, host: "mongo3:27017" } ] }); ``` 在上面的示例中,我们使用rs.initiate()函数初始化了一个名为"mongoRs"的副本,并指定了三个成员(mongo1,mongo2和mongo3)。 要部署这个MongoDB副本,只需在终端中导航到Docker Compose文件所在的目录,并运行以下命令: ```shell docker-compose up -d ``` 这将启动所有的MongoDB容器,并在后台运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值