无法从节点连接到 docker 中的 mongo 副本集

Posted

技术标签:

【中文标题】无法从节点连接到 docker 中的 mongo 副本集【英文标题】:Cannot connect from node to mongo replicaset in docker 【发布时间】:2019-11-29 02:01:06 【问题描述】:

我已经建立了一个 docker 网络,我在其中设置了 3 个 mongo 容器。

我所做的总结:

    创建了一个 docker 网络,我在其中设置了 3 个 mongo docker 容器

    为第一个节点打开 mongo shell 并设置副本集的配置

    尝试从节点应用连接,失败

    成功从 mongo shell 连接到 replicaSet

下面我更详细地介绍了我的尝试。

这些是我为 docker 运行的以下 cmd:

docker network create my-mongo-cluster

docker run -d -p 30001:27017 --name mongo1 --net my-mongo-cluster mongo mongod --replSet my-mongo-set

docker run -d -p 30002:27017 --name mongo2 --net my-mongo-cluster mongo mongod --replSet my-mongo-set

docker run -d -p 30003:27017 --name mongo3 --net my-mongo-cluster mongo mongod --replSet my-mongo-set

docker exec -it mongo1 mongo

config =  "_id": "my-mongo-set", "members": ["_id": 0, "host": "mongo1:27017","_id": 1,"host": "mongo2:27017","_id": 3,"host": "mongo3:27017"    ]

rs.initiate(config)

我已经从 MongoDB Compass 连接到主节点 192.168.1.3:30001 并使用一个集合用户创建了一个数据库测试。

从节点我尝试以下操作:

const app = require('express')();
const mongoose = require('mongoose');

//set up mongo connect
const uri = 'mongodb://192.168.1.3:30001,192.168.1.3:30002,192.168.1.3:30003/test'
mongoose.connect(uri, useNewUrlParser: true, replicaSet: 'my-mongo-set')
  .then(() => console.log("MongoDB Connected"))
  .catch(error => console.log(error));

我从中得到

Debugger attached.
 MongoNetworkError: failed to connect to server [mongo3:27017] on first connect [MongoNetworkError: getaddrinfo ENOTFOUND mongo3 mongo3:27017]
    at Pool.<anonymous> (C:\Workspaces\intelij\trial&error\spring-reactive-security\mongo-transactional\node_modules\mongodb-core\lib\topologies\server.js:431:11)
    at Pool.emit (events.js:198:13)
    at connect (C:\Workspaces\intelij\trial&error\spring-reactive-security\mongo-transactional\node_modules\mongodb-core\lib\connection\pool.js:557:14)
    at makeConnection (C:\Workspaces\intelij\trial&error\spring-reactive-security\mongo-transactional\node_modules\mongodb-core\lib\connection\connect.js:39:11)
    at callback (C:\Workspaces\intelij\trial&error\spring-reactive-security\mongo-transactional\node_modules\mongodb-core\lib\connection\connect.js:261:5)
    at Socket.err (C:\Workspaces\intelij\trial&error\spring-reactive-security\mongo-transactional\node_modules\mongodb-core\lib\connection\connect.js:286:7)
    at Object.onceWrapper (events.js:286:20)
    at Socket.emit (events.js:198:13)
    at emitErrorNT (internal/streams/destroy.js:91:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:59:3)
    at process._tickCallback (internal/process/next_tick.js:63:19)
  name: 'MongoNetworkError',
  errorLabels: [ 'TransientTransactionError' ],
  [Symbol(mongoErrorContextSymbol)]:  
Waiting for the debugger to disconnect...

Process finished with exit code 0

但如果我从 mongo shell 尝试,我可以连接:

mongo "mongodb://192.168.1.3:30001,192.168.1.3:30002,192.168.1.3:30003/test"
MongoDB shell version v4.0.10
connecting to: mongodb://192.168.1.3:30001,192.168.1.3:30002,192.168.1.3:30003/test?gssapiServiceName=mongodb
Implicit session: session  "id" : UUID("89994673-11c2-4d6c-8cb5-04041094c147") 
MongoDB server version: 4.0.10
Server has startup warnings:
2019-07-20T06:22:00.476+0000 I STORAGE  [initandlisten]
2019-07-20T06:22:00.476+0000 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2019-07-20T06:22:00.476+0000 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2019-07-20T06:22:01.185+0000 I CONTROL  [initandlisten]
2019-07-20T06:22:01.185+0000 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2019-07-20T06:22:01.185+0000 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2019-07-20T06:22:01.185+0000 I CONTROL  [initandlisten]
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).

The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---

my-mongo-set:PRIMARY>

【问题讨论】:

【参考方案1】:

好的,所以我终于弄清楚我做错了什么。也许这会对某人有所帮助:

您要么进入 C:\Windows\System32\drivers\etc 并放入主机 MACHINE_IP mongo1 mongo2 mongo3,或者只需将配置替换为:

config =  "_id": "my-mongo-set", "members": ["_id": 0, "host": "MACHINE_IP:30001","_id": 1,"host": "<MACHINE_IP>:30002","_id": 2,"host": "<MACHINE_IP>:30003"    ]

我在 mongo 确定哪个是主要的时遇到了一些问题,所以我稍微修改了 docker 运行,将 MONGODB_REPLICA_SET_MODEMONGODB_PRIMARY_HOST 添加为:


docker run -d -p 30001:27017 --name mongo1 -e MONGODB_REPLICA_SET_MODE=primary --net my-mongo-cluster mongo mongod --replSet my-mongo-set

docker run -d -p 30002:27017 --name mongo2 -e MONGODB_REPLICA_SET_MODE=secondary -e MONGODB_PRIMARY_HOST=mongo1 --net my-mongo-cluster mongo mongod --replSet my-mongo-set

docker run -d -p 30003:27017 --name mongo3 -e MONGODB_REPLICA_SET_MODE=secondary -e MONGODB_PRIMARY_HOST=mongo1 --net my-mongo-cluster mongo mongod --replSet my-mongo-set

【讨论】:

我知道现在出了什么问题。您的容器未链接或位于同一 docker 网络中,因此您通过主机/机器 ip 连接它们。你安装了 docker-compose 吗?如果可以的话,你最好使用 compose。谷歌“docker compose mongo cluster”这是一个例子:github.com/senssei/mongo-cluster-docker 谢谢哥们!!我在某个问题上被锁定了将近两天,您的帖子给了我一个提示。非常感谢!!!!!! 有人在使用 Docker Compose,更多信息在这里:github.com/bitnami/bitnami-docker-mongodb/issues/149

以上是关于无法从节点连接到 docker 中的 mongo 副本集的主要内容,如果未能解决你的问题,请参考以下文章

无法使用mongo连接到docker容器

无法使用mongoose连接到mongo docker镜像

从主机连接到 mongo docker 容器

MongooseModule:无法连接到数据库。在带有 Mongo 的 dockerized Nestjs 应用程序上

Docker中的Spring Boot未连接到Docker中的Mongo

尝试从 Spring Boot Docker 容器连接到 mongo Docker 容器时验证 MongoCredential 时出错?