«Ошибка истечения времени выбора сервера» Драйвер MongoDB Go с Docker - PullRequest
0 голосов
/ 21 декабря 2018

Я работаю над очень простой (я думал) стартовой программой на Go, используя MongoDB и Docker.Попытка разобраться с ними, прежде чем мы начнем использовать их на работе.Мой MongoDB работает в контейнере Docker, просто используя мой локальный хост, используя официальный образ Docker.Это работает нормально, я могу подключиться к нему через MongoDB Compass и изменить БД.

Моей следующей задачей было создание отдельного контейнера Docker, который мог бы читать и записывать в БД.Я использую MongoDB-Go-Driver (https://godoc.org/github.com/mongodb/mongo-go-driver/mongo) для этого, поскольку mgo больше не поддерживается.

Это мой код, я просто следую многочисленным онлайн-учебникам, чтобы сделать простоеподключиться, а затем пропинговать базу данных, чтобы обеспечить подключение.

client, err := mongo.Connect("mongodb://localhost:27017")

if err != nil {
    log.Fatal("error ", err)
}

// Check the connection
err = client.Ping(context.TODO(), nil)

if err != nil {
    log.Fatal("error2 ", err)
}

fmt.Println("Connected to MongoDB!")

При выполнении любой операции с базой данных (Find, FindOne, Ping и т. д.) всегда происходит сбой с error2 server selection timeout

Thisэто мой файл для создания докеров, который я запускаю.

version: "3"

services:
  datastore:
    image: mongo
    ports: 
      - "27017:27017"
    networks: 
      - maccaptionNet
    volumes: 
      - .:/go/src/maccaption_microservice/dbdata
  jobservice:
    image: jobservicemaccaption:1.0
    networks:
      - maccaptionNet
    depends_on:
      - "datastore"


networks: 
  maccaptionNet:
    driver: bridge

Я новичок в MongoDB и после нескольких часов исследований не достиг никакого прогресса в этом. Я прочитал https://docs.mongodb.com/manual/core/read-preference-mechanics/ https://docs.mongodb.com/manual/replication/

Может кто-нибудь указать мне правильное направление для этого? Я не смог найти много по этому конкретному вопросу.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Если вы подключаетесь к одному докеру из другого (как это написано в вашем файле docker-compose, и в сетевом режиме bridge вам нужно изменить localhost на имя хоста, например datastore

client, err := mongo.Connect("mongodb://datastore:27017")

Когда ваш скрипт go использует localhost, он ожидает, что база данных будет находиться в том же докере

0 голосов
/ 20 апреля 2019

Каким-то образом я решил эту проблему по-другому: изменив ports с "27018:27017" на "27017:27017".ИДК, почему это помогает.Возможно, если Mongo видит не порт по умолчанию, он думает, что есть кластер узлов Mongo.

0 голосов
/ 21 декабря 2018

Когда вы запускаете службу и mongodb в докере, вы не можете использовать localhost, поскольку служба находится в другом контейнере, чем mongodb, и с точки зрения докера она находится под другим IP-адресом.

Вы можете соединиться с именем службы, которое вы указали в docker-compose datastore

mongo.Connect("mongodb://datastore:27017")

Редактировать:

из: https://docs.docker.com/compose/networking/

По умолчанию Compose настраивает единую сеть для вашего приложения.Каждый контейнер для службы присоединяется к сети по умолчанию и доступен как другим контейнерам в этой сети, так и обнаруживается ими с именем хоста, идентичным имени контейнера

Это означает, что при запуске нескольких контейнеров через composeВы можете получить доступ к одному контейнеру из другого по имени контейнера,

Обычно, когда запускается docker-compose, он устанавливает сеть, и каждый контейнер в compose присоединяется к сети под своим именем контейнера.Для точки контейнера, если смотреть, localhost - это просто сам контейнер, в то время как он может искать имя другого контейнера и возвращать IP-адрес контейнера.

Предполагая, что докер работает на вашем локальном хосте, вы можетеустановить имя в etc/hosts файле следующим образом:

127.0.0.1 datastore

(если не просто заменить 127.0.0.1 на IP-адрес докера)

И в приложении вы будете подключаться с mongodb://datastore:27017

Таким образом, вы сможете запускать службу как в докере, так и извне, если решите запустить только db в докере

docker-compose start datastore
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...