带有Docker的“服务器选择超时错误” MongoDB Go驱动程序

时间:2018-12-21 16:04:08

标签: mongodb docker go

我正在使用MongoDB和Docker开发一个非常基本的(我认为)入门程序。在我们开始在工作中使用它们之前,先尝试弄清楚它们。 我将MongoDB运行在D​​ocker容器中,仅使用本地主机,使用官方Docker映像。运行正常,我可以通过MongoDB Compass连接到它并修改数据库。

我的下一个任务是构建一个单独的Docker容器,该容器能够读取和写入数据库。我正在使用MongoDB-Go-Driver(https://godoc.org/github.com/mongodb/mongo-go-driver/mongo),因为mgo不再跟上。

这是我的代码,我只是在线上阅读众多教程以进行简单连接,然后对数据库执行ping操作以确保连接性。

client, err := mongo.Connect("mongodb://localhost:27017")

if err != nil {
    log.Fatal("error ", err)
}

// Check the connection
err = client.Ping(context.TODO(), nil)

if err != nil {
    log.Fatal("error2 ", err)
}

fmt.Println("Connected to MongoDB!")

使用error2 server selection timeout对数据库进行任何操作(查找,FindOne,Ping等)总是失败

这是我正在运行的docker-compose文件。

version: "3"

services:
  datastore:
    image: mongo
    ports: 
      - "27017:27017"
    networks: 
      - maccaptionNet
    volumes: 
      - .:/go/src/maccaption_microservice/dbdata
  jobservice:
    image: jobservicemaccaption:1.0
    networks:
      - maccaptionNet
    depends_on:
      - "datastore"


networks: 
  maccaptionNet:
    driver: bridge

我是MongoDB的新手,经过数小时的研究,这方面没有任何进展。 我已阅读https://docs.mongodb.com/manual/core/read-preference-mechanics/ https://docs.mongodb.com/manual/replication/

有人可以为此指出正确的方向吗?在这个特定问题上,我找不到很多东西。

谢谢!

5 个答案:

答案 0 :(得分:2)

在docker中运行服务和mongodb时,您不能使用localhost,因为该服务与mongodb位于不同的容器中,并且从docker的角度来看,它位于不同的IP地址。

您可以使用您在docker-compose datastore

中指定的服务名称进行连接
mongo.Connect("mongodb://datastore:27017")

编辑:

来自:https://docs.docker.com/compose/networking/

  

默认情况下,Compose为您的应用设置单个网络。每   服务的容器加入默认网络,并且两者都是   可被该网络上的其他容器访问,并被   它们的主机名与容器名称相同

意味着,如果您通过compose运行多个容器,则可以通过容器名称

来访问另一个容器

基本上docker-compose启动时,它会建立网络,并且组合中的每个容器都以其容器名称加入网络。对于容器的观点,localhost只是容器本身,而他可以搜索其他容器的名称并获取该容器的IP地址。

假设docker在您的本地主机上运行,​​您可以像这样在etc/hosts文件中设置名称:

127.0.0.1 datastore

((如果不只是将127.0.0.1替换为docker ip)

在该应用中,您将与mongodb://datastore:27017

连接

因此,如果您决定仅在docker中运行db,则将可以在docker中和从外部运行服务

docker-compose start datastore

答案 1 :(得分:2)

如果您要从另一个泊坞窗连接到另一个泊坞窗(例如它写在docker-compose文件中,并且使用bridge网络模式,则必须将localhost更改为主机名,像datastore

client, err := mongo.Connect("mongodb://datastore:27017")

当您的go脚本使用localhost时,它期望数据库位于同一泊坞窗中

答案 2 :(得分:1)

我遇到了同样的问题,但是找到了解决该问题的另一种方法。您只需在运行docker image时传递网络参数,这样docker便会指向正确的localhost。

docker run --network="host" ....

Source for this solution

答案 3 :(得分:0)

我已经以不同的方式解决了这个问题:将ports"27018:27017"更改为"27017:27017"。 IDK为什么会有帮助。也许如果Mongo看到不是默认端口,它会认为其中存在Mongo节点的群集。

答案 4 :(得分:0)

我认为我的答案可能无关紧要,但是仍然出现相同的错误,这是因为我的IP地址未在MongoDB地图集的IP白名单选项卡中列出,因此在尝试进行操作之前,请确保在此处拥有IP地址连接。