Клиентский докер-контейнер GOLANG становится недоступным при попытке подключения к контейнеру mongodb - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть простая программа, написанная на 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, а другой, чтобы раскрутить Монго:

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 для раскрутки 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 version 2

однако, мой файл docker-compose.yml в том виде, в котором он стоит «Должен» на бумаге.

Может кто-нибудь указать мне правильное направление, почему мой код GOLANG не может найти мой экземпляр mongodb.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018
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.

Вы должны иметь возможность подключиться из контейнера golang к контейнеру mongo, используя межконтейнерную связь с использованием имени хоста: 'mongo'

0 голосов
/ 30 апреля 2018

Я думаю, что когда вы вызываете mgo.Dial("localhost:27017"), часть localhost ссылается на localhost в контейнере golang, а не на хост, на котором работают контейнеры.

Docker разрешит имена контейнеров как имена хостов, изменит набор на mgo.Dial("mongo:27017"), и он должен работать.

Из документации сетевого моста докера

Определяемые пользователем мосты обеспечивают автоматическое разрешение DNS между контейнерами.

Контейнеры в мостовой сети по умолчанию могут получить доступ друг к другу только IP-адреса, если вы не используете опцию --link, которая считается наследство. В определяемой пользователем мостовой сети контейнеры могут разрешать каждый другой по имени или псевдониму.

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

...