我有一个用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,该conf文件将实例设置为绑定到所有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使用docker-compose版本2
但是,我的docker-compose.yml文件在书面工作中仍为“应该”。
有人可以向我指出正确的方向,为什么我的GOLANG代码找不到我的mongodb实例。
我认为,当您调用mgo.Dial("localhost:27017")
该localhost
部件时,它是指golang容器中的localhost,而不是容器在其上运行的主机。
Docker会将容器名称解析为主机名,将拨号更改为mgo.Dial("mongo:27017")
,它应该可以工作。
来自Docker容器联网桥文档
用户定义的网桥可在容器之间提供自动DNS解析。
默认网桥网络上的容器只能通过IP地址互相访问,除非您使用--link选项(这被认为是旧的)。在用户定义的网桥网络上,容器可以通过名称或别名相互解析。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句