登录
首页 >  Golang >  Go问答

超时错误解决方案:MongoDB Go 驱动程序与 Docker

来源:stackoverflow

时间:2024-03-07 23:09:26 337浏览 收藏

今天golang学习网给大家带来了《超时错误解决方案:MongoDB Go 驱动程序与 Docker》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

我正在使用 mongodb 和 docker 在 go 中开发一个非常基本的(我认为)入门程序。在我们开始在工作中使用它们之前,尝试先掌握它们。 我已经让 mongodb 在 docker 容器中运行,仅使用我的本地主机,使用官方 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 服务器选择超时 对数据库执行任何操作(find、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/

有人能指出我正确的方向吗?我找不到关于这个具体问题的很多信息。

谢谢!


解决方案


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

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

mongo.connect("mongodb://datastore:27017")

编辑:

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

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

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

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

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

127.0.0.1 datastore

(如果不只是用docker ip替换127.0.0.1

在应用程序中,您将连接到 mongodb://datastore:27017

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

docker-compose start datastore

如果您要从另一个 docker 连接到一个 docker(就像 docker-compose 文件中写入的那样,并使用 bridge 网络模式),则必须将 localhost 更改为主机名,例如 datastore

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

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

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《超时错误解决方案:MongoDB Go 驱动程序与 Docker》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>