gpt4 book ai didi

mongodb - 尝试连接到 mongodb 容器时,GOLANG 客户端 docker 容器无法访问

转载 作者:IT王子 更新时间:2023-10-29 01:57:04 24 4
gpt4 key购买 nike

我有一个用 golang 编写的简单程序,它连接到一个 mongodb 实例:

func main() {
session, err := mgo.Dial("localhost:27017")

if err != nil {
panic(err)
}

defer session.Close()
session.SetMode(mgo.Monotonic, true)
ensureIndex(session)
}

我使用 docker compose 启动两个容器,一个启动我的 GOLANG API,另一个启动 mongo:

version: "3.3"

services:
api:
image: golang:latest
volumes:
- .:/go
working_dir: /go
environment:
- GOPATH=/go
command:
go run /go/src/main.go
ports:
- "8082:8000"
depends_on:
- db
networks:
- api-net

db:
build: .
expose:
- '27017'
container_name: 'mongo'
ports:
- "27017:27017"
networks:
- api-net

networks:
api-net:
driver: bridge

我使用 Dockerfile 来启动带有 conf 文件的 mongo,该文件将实例设置为绑定(bind)到所有 IPV4 和 IPV6 网络:

FROM mongo:latest

COPY mongod.conf /etc/mongod.conf
CMD mongod --config /etc/mongod.conf##

这是 mongod.conf 文件:

systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log

# network interfaces
net:
port: 27017
bindIp: 0.0.0.0

当我运行 docker-compose.up 时,这是我得到的:

Building db
Step 1/3 : FROM mongo:latest
---> a0f922b3f0a1
Step 2/3 : COPY mongod.conf /etc/mongod.conf
---> Using cache
---> f270e718c11e
Step 3/3 : CMD mongod --config /etc/mongod.conf
---> Running in 89ffc2495a2a
Removing intermediate container 89ffc2495a2a
---> fe2677d53122

Successfully built fe2677d53122
Successfully tagged carsupermarket_db:latest
WARNING: Image for service db was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating mongo ... done
Creating carsupermarket_api_1 ... done
Attaching to mongo, carsupermarket_api_1
api_1 | panic: no reachable servers
api_1 |
api_1 | goroutine 1 [running]:
api_1 | main.main()
api_1 | /go/src/main.go:38 +0x291
api_1 | exit status 2

我搜索了 Google 和 stackoverflow,我唯一能找到的与我的问题隐约相关的是:

mongod --bind_ip using docker-compose version 2

但是,我的 docker-compose.yml 文件在书面工作中处于“应该”状态。

有人可以指出我的 GOLANG 代码为何找不到我的 mongodb 实例的正确方向吗?

最佳答案

我认为当您调用 mgo.Dial("localhost:27017") 时,localhost 部分指的是 golang 容器中的本地主机,而不是主机容器正在运行。

Docker 会将容器名称解析为主机名,将拨号更改为 mgo.Dial("mongo:27017"),它应该可以工作。

来自 docker 容器网络桥文档

用户定义的网桥在容器之间提供自动 DNS 解析。

Containers on the default bridge network can only access each other by IP addresses, unless you use the --link option, which is considered legacy. On a user-defined bridge network, containers can resolve each other by name or alias.

https://docs.docker.com/network/bridge/

关于mongodb - 尝试连接到 mongodb 容器时,GOLANG 客户端 docker 容器无法访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50098773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com