我正在使用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!")
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/
有人可以为此指出正确的方向吗?在这个特定问题上,我找不到很多东西。
谢谢!
当您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)