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

hen*_*ini 5 go mongodb docker

我正在使用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!")
Run Code Online (Sandbox Code Playgroud)

使用以下命令对数据库执行任何操作(Find,FindOne,Ping等)时总是失败 error2 server selection timeout

这是我正在运行的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
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

ore*_*ren 8

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

您可以使用您在 docker-compose 中指定的服务名称进行连接 datastore

mongo.Connect("mongodb://datastore:27017")
Run Code Online (Sandbox Code Playgroud)

编辑:

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

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

这意味着如果您通过 compose 运行多个容器,则可以通过容器名称从另一个容器访问一个容器,

基本上,在docker-compose启动时,它会设置网络,并且 compose 中的每个容器都以其容器名称加入网络。对于一个容器来说,如果看,localhost只是容器本身,而他可以搜索其他容器的名称并取回容器的IP地址。

假设 docker 在您的本地主机上运行,​​您可以在etc/hosts文件中设置名称,如下所示:

127.0.0.1 datastore
Run Code Online (Sandbox Code Playgroud)

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

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

因此,如果您决定仅db在 docker 中运行,您将能够在 docker 中和从外部运行该服务

docker-compose start datastore
Run Code Online (Sandbox Code Playgroud)

  • 只是为了让我知道我的理解是正确的 - 我需要使用我正在使用的 Docker 容器的名称而不是实际的本地主机,因为数据库存储在 Docker 容器的本地主机中,而不是技术上我的本地主机? (2认同)