我使用 Docker 設置并運行了一個 MongoDB 副本,我可以通過控制臺或 Robo3T 客戶端進行訪問,并運行任何查詢。這些是容器:$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESefe6ae03323d mongo "docker-entrypoint.s…" 10 minutes ago Up 10 minutes 0.0.0.0:30001->27017/tcp mongo157d2701c8a43 mongo "docker-entrypoint.s…" 10 minutes ago Up 10 minutes 0.0.0.0:30002->27017/tcp mongo27553966b9ff5 mongo "docker-entrypoint.s…" 10 minutes ago Up 10 minutes 0.0.0.0:30003->27017/tcp mongo3問題是當我嘗試使用mongo-go-driver進行 ping 時出現錯誤(我嘗試使用版本 1.0.0 和 1.0.2)// Create MongoDB client client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:30001"))if err != nil { t.Fatalf("Exit error: %v", err)}ctx, cancel := context.WithTimeout(context.Background(), time.Minute)defer cancel()err = client.Connect(ctx)if err != nil { t.Fatalf("Exit error: %v", err)}ctx, cancel = context.WithTimeout(context.Background(), time.Minute)defer cancel()// Pingerr = client.Ping(ctx, readpref.Primary())if err != nil { t.Fatalf("Exit error Ping: %v", err)}錯誤如下:Exit error Ping: server selection error: server selection timeout current topology: Type: ReplicaSetNoPrimary Servers: Addr: mongo2:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo2: no such host Addr: mongo3:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo3: no such host Addr: mongo1:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo1: no such host
1 回答

楊__羊羊
TA貢獻1943條經驗 獲得超7個贊
這是由于hostname
Docker 主機未解決。在 Docker 中,實例mongo1
、mongo2
和mongo3
可以通過這些名稱訪問。但是,無法從 Docker 主機訪問這些名稱。這行很明顯:
Addr:?mongo2:27017,?Type:?Unknown,?State:?Connected,?Average?RTT:?0,?Last?error:?dial?tcp:?lookup?mongo2:?no?such?host
MongoDB 驅動程序將嘗試server discovery
從給定的副本集成員;它將找到副本集中的所有其他節點(通過rs.conf)。這里的問題是副本集設置了名稱mongo<N>
,驅動程序(在 Docker 主機中運行)將無法解析這些名稱。您可以通過嘗試從 Docker 主機 ping 來確認這一點mongo1
。
您可以嘗試從與副本集共享同一 Docker 網絡的另一個 Docker 實例運行應用程序?;蛘撸薷?Docker 網絡以允許可解析的主機名。
這是由于連接方式的不同。當指定單個節點時,即mongodb://node1:27017
在 shell 或 PyMongo 中,不會進行服務器發現。相反,它將嘗試連接到該單個節點(而不是作為副本集的一部分)。問題是您需要連接到副本集的主節點才能寫入(您必須知道是哪一個)。如果您想作為副本集連接,則必須定義副本集名稱。
與 相比mongo-go-driver
,默認情況下它將執行服務器發現并嘗試作為副本集進行連接。如果您想作為單個節點連接,則需要connect=direct
在連接 URI 中指定。
- 1 回答
- 0 關注
- 157 瀏覽
添加回答
舉報
0/150
提交
取消