API NodeJS MongoDB в контейнере Docker не может подключиться к базе данных, работающей на хосте

#node.js #mongodb #docker

#node.js #mongodb #докер

Вопрос:

У меня есть база данных MongoDB, настроенная на моем хост-сервере, и контейнер docker, работающий на этом хосте с приложением NodeJS. В этом приложении я пытаюсь подключиться к базе данных на хосте, но время ожидания запроса всегда истекает.

Я установил сеть на «хост» и использовал адрес «хост.докер.внутренний». Я также попытался установить mongodb-оболочку, и это действительно работает! Таким образом, в принципе, я могу подключиться к базе данных с помощью оболочки в контейнере, но не с помощью API MongoDB NodeJS.

Код приложения NodeJS:

 const mongodb = require('mongodb'); mongodb.MongoClient.connect("mongodb://host.docker.internal:27017/");  

использование mongo mongodb://host.docker.internal:27017/ в оболочке работает, и я правильно подключаюсь.

Комментарии:

1. Вы также настроили mongodb для прослушивания этого интерфейса? IIRC-это что-то из сети 172.0.0.0/8, и монго по умолчанию слушает только на локальном хосте.

2. Я так не думаю. Хост-сеть, насколько я понимаю, просто означает, что контейнеры работают так, как они работали бы непосредственно на вашем компьютере. Кроме того, это не должно быть проблемой, потому что он работает с оболочкой, что означает, что он может подключаться из контейнера, верно?

3. В вашем URL-адресе отсутствуют имя пользователя и пароль… «mongodb://user:pass@host.docker.internal:27017/»

4. Это интересно. У меня нет поблизости компьютера mac, чтобы воспроизвести его, но если бы я это сделал, моим первым шагом было бы проверить, что говорит tcpdump/wireshark

5. Чего я никак не могу понять, так это как ты вообще получаешь этот тайм-аут? Ты не пользуешься никаким обратным вызовом? У показанного кода просто нет средств что-то сделать, когда он работает или даже когда он не работает… Откуда вы знаете, что это не работает?

Ответ №1:

Наконец-то я выяснил, в чем проблема. Мне пришлось привязать его к правильным IP-адресам / в моей конфигурации я использовал аргумент --bind_ip_all .

Большое спасибо за помощь!