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

时间:2018-04-30 10:37:44

标签: mongodb docker go docker-compose

我有一个用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实例。

2 个答案:

答案 0 :(得分:2)

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

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

来自docker容器网络桥文件

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

  

默认网桥上的容器只能通过相互访问   IP地址,除非您使用--link选项,这是考虑的   遗产。在用户定义的桥接网络上,容器可以解析每个网络   其他名称或别名。

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

答案 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'