我正在使用MongoDB和Docker开发一个非常基本的(我认为)入门程序。在我们开始在工作中使用它们之前,先尝试弄清楚它们。 我将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 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/
有人可以为此指出正确的方向吗?在这个特定问题上,我找不到很多东西。
谢谢!
答案 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" ....
答案 3 :(得分:0)
我已经以不同的方式解决了这个问题:将ports
从"27018:27017"
更改为"27017:27017"
。
IDK为什么会有帮助。也许如果Mongo看到不是默认端口,它会认为其中存在Mongo节点的群集。
答案 4 :(得分:0)
我认为我的答案可能无关紧要,但是仍然出现相同的错误,这是因为我的IP地址未在MongoDB地图集的IP白名单选项卡中列出,因此在尝试进行操作之前,请确保在此处拥有IP地址连接。