我有一个用golang编写的简单程序,它连接到一个mongodb实例,因此:
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
我使用docker compose旋转两个容器来旋转我的GOLANG API,另一个旋转mongo:
FROM mongo:latest
COPY mongod.conf /etc/mongod.conf
CMD mongod --config /etc/mongod.conf##
我使用Dockerfile以使用conf文件启动mongo,该文件将实例设置为绑定到所有IPV4和IPV6网络:
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
这是mongod.conf文件:
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
当我运行docker-compose.up时,这就是我得到的:
SELECT
tarif.tReduit,
tarif.tPlein,
client.grilleTarif,
CASE client.grilleTarif
WHEN 'tReduit'
THEN tarif.tReduit
WHEN 'tPlein'
THEN tarif.tPlein
ELSE tarif.tPlein
END AS 'Tarif en vigueur'
FROM tarif
JOIN client
WHERE client.nom = 'admin' and tarif.nomActivity IS NULL;
我已经搜索了Google和stackoverflow,我唯一能找到的与我的问题模糊相关的是:
mongod --bind_ip using docker-compose version 2
然而,我的docker-compose.yml文件在纸上工作时是“应该”。
有人可以指出我正确的方向,为什么我的GOLANG代码找不到我的mongodb实例。
答案 0 :(得分:2)
我认为当你调用mgo.Dial("localhost:27017")
时,localhost
部分引用golang容器中的localhost,而不是容器正在运行的主机。
Docker会将容器名称解析为主机名,将拨号更改为mgo.Dial("mongo:27017")
,它应该可以正常工作。
来自docker容器网络桥文件
用户定义的网桥在容器之间提供自动DNS解析。
默认网桥上的容器只能通过相互访问 IP地址,除非您使用--link选项,这是考虑的 遗产。在用户定义的桥接网络上,容器可以解析每个网络 其他名称或别名。
答案 1 :(得分:0)
version: "2"
services:
api:
image: golang:latest
volumes:
- .:/go
# Work dir should be defined in dockerfile
#working_dir: /go
environment:
- GOPATH=/go
command:
go run /go/src/main.go
ports:
- "8082:8000"
depends_on:
- db
db:
build: .
container_name: 'mongo'
# You should define some volumes here if you want the data to persist.
您应该能够使用主机名使用inter container容器从golang容器连接到mongo容器:'mongo'