通过 docker 运行的 MongoDB 服务器无法相互看到(名称解析暂时失败)

好的,我有一个在 M1 mac 上运行的 multipass vm。它托管一个 ubuntu 服务器。在这台 ubuntu 服务器上,我安装了 go、gin 和一系列其他相关技术。然后我去mongo。


我首先创建复制集sudo docker network create mongoCluster


然后我启动三个节点:


sudo docker run -d -p 27017:27017 --name mongo1 --network mongoCluster -e MONGODB_INITDB_ROOT_USERNAME=myuser -e MONGODB_INITDB_ROOT_PASSWORD=mypassword -e MONGO_INITDB_DATABASE=task mongo:latest mongod --replSet myReplicaSet --bind_ip localhost,mongo1


sudo docker run -d -p 27018:27017 --name mongo2 --network mongoCluster mongo:latest mongod --replSet myReplicaSet --bind_ip localhost,mongo2


sudo docker run -d -p 27019:27017 --name mongo3 --network mongoCluster mongo:latest mongod --replSet myReplicaSet --bind_ip localhost,mongo3

然后我初始化复制集


sudo docker exec -it mongo1 mongosh --eval "rs.initiate({

 _id: \"myReplicaSet\",

 members: [

   {_id: 0, host: \"mongo1\"},

   {_id: 1, host: \"mongo2\"},

   {_id: 2, host: \"mongo3\"}

 ]

})"

运行sudo docker exec -it mongo2 mongosh --eval "rs.status()"显示我已经正确设置了 mongo1 作为 PRIMARY


到目前为止,一切都很好!


然后我启动我的应用程序并与 uri 建立连接:mongodb://myuser:mypassword@localhost:27017/?retryWrites=true&w=majority Mongo 抛出一个错误Failed to ping cluster,但它随后报告它已连接然后它抛出这个:


Could not create Task: server selection error: context deadline exceeded, current topology: { Type: ReplicaSetNoPrimary, Servers: [{ Addr: mongo1:27017, Type: Unknown, Last error: connection() error occurred during connection handshake: dial tcp: lookup mongo1: Temporary failure in name resolution }, { Addr: mongo2:27017, Type: Unknown, Last error: connection() error occurred during connection handshake: dial tcp: lookup mongo2: Temporary failure in name resolution }, { Addr: mongo3:27017, Type: Unknown, Last error: connection() error occurred during connection handshake: dial tcp: lookup mongo3: Temporary failure in name resolution }, ] }

所以看起来各个节点看不到对方我已经在 googs 上搜索了一段时间,但似乎没有任何东西可以解决我的具体问题


我什至花钱参加培训课程来解决这个问题,但我没有。请帮忙!


饮歌长啸
浏览 128回答 1
1回答

慕的地6264312

这里有几个问题。首先和MONGODB_INITDB_ROOT_USERNAME都是MONGODB_INITDB_ROOT_PASSWORD错误的。他们应该是MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_USERNAME。问题是mongo1启动后不久就会崩溃,因为它需要一个secret.key. 检查日志,您将看到错误。解决这个问题是另一个问题。我建议先尝试不进行身份验证。这是有效的方法:您缺少的步骤:echo 127.0.0.1 mongo1 >> /etc/hosts数据库启动脚本:#!/bin/bashdocker container rm -f mongo1 mongo2 mongo3docker run -d -p 27017:27017 --name mongo1 --network mongoCluster mongo:latest mongod --replSet myReplicaSet --bind_ip_alldocker run -d -p 27018:27017 --name mongo2 --network mongoCluster mongo:latest mongod --replSet myReplicaSet --bind_ip_alldocker run -d -p 27019:27017 --name mongo3 --network mongoCluster mongo:latest mongod --replSet myReplicaSet --bind_ip_alldocker exec -it mongo1 mongosh --eval "rs.initiate({ _id: \"myReplicaSet\", members: [   {_id: 0, host: \"mongo1\"},   {_id: 1, host: \"mongo2\"},   {_id: 2, host: \"mongo3\"} ]})"go中的测试程序:package mainimport (    "context"    "fmt"    "time"    "go.mongodb.org/mongo-driver/mongo"    "go.mongodb.org/mongo-driver/mongo/options"    "go.mongodb.org/mongo-driver/mongo/readpref")const uri = "mongodb://mongo1:27017/task?replicaSet=myReplicaSet&retryWrites=true&w=majority"func main() {    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)    defer cancel()    client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))    if err != nil {        panic(err)    }    defer func() {        if err = client.Disconnect(ctx); err != nil {            panic(err)        }    }()    if err := client.Ping(ctx, readpref.Primary()); err != nil {        panic(err)    }    fmt.Println("Successfully connected and pinged")}运行这个,你应该得到一个成功的响应:> go run ./main.go Successfully connected and pinged另外我认为您不需要映射主机上的所有副本端口。这应该使事情更清洁。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go