Почему соединение приложения Node.js 12 docker с MongoDB 4 через сеть docker дает тайм-аут, в то время как соединение через сеть publi c работает? - PullRequest
0 голосов
/ 14 февраля 2020

Я вижу проблему, которую вообще не могу объяснить:

После обновления приложения Meteor до версии 1.9 и, следовательно, Node.js 12, мы также должны переключить docker контейнеры на Node.js 12 основанных контейнеров. В нашем случае мы используем abernix / meteord: node-12-base (git).

После загрузки обновленного приложения мы получаем тайм-аут БД в docker контейнер приложения:

/bundle/bundle/programs/server/node_modules/fibers/future.js:313
                                               throw(ex);
                                               ^

MongoTimeoutError: Server selection timed out after 10000 ms
    at Timeout._onTimeout (/bundle/bundle/programs/server/npm/node_modules/meteor/npm-mongo/node_modules/mongodb-core/lib/sdam/topology.js:773:16)
    at listOnTimeout (internal/timers.js:531:17)
    at processTimers (internal/timers.js:475:7) {
  name: 'MongoTimeoutError',
  [Symbol(mongoErrorContextSymbol)]: {}
}


Это происходит со следующими MONGO_URL:

❌ mongodb: // root: OurPw @ mon go - docker -alias : 27017 / meteor? AuthSource = admin

Как ни странно, когда мы открываем порт 27017 в контейнере MongoDB, следующий MONGO_URL просто работает:

✔️ mongodb: // root: OurPw @ docker -host : 27017 / meteor? authSource = admin


Теперь я подумал, что у нас проблема docker, но если я присоединяюсь к bash внутри контейнера метаданных Node.js 12, apt установите оболочку MongoDB и попытайтесь подключиться с помощью:

✔️ mon go "mongodb: // root: OurPw @ mon go - docker -alias : 27017 / meteor? AuthSource = admin"

это тоже просто работает.


А теперь я остался без понятия. Я пробовал несколько изображений MongoDB docker между v4.0 и 4.2.3, а также Node.js 12.14 и 12.10. И я также пытался один раз без аутентификации MongoDB просто исключить это как проблему, но результат всегда один и тот же.

Любая идея будет очень цениться, так как я хотел бы избежать необходимости подключения через незащищенный порт и имя хоста docker, потому что он явно подвержен ошибкам ...

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020

tl; др:

настройка dns_search: '' для бэкенда в docker-compose.yml (или через docker CLI или другими способами) проблема.

Дополнительная информация:

Docker, кажется, добавляет любую директиву search хоста /etc/resolv.conf к /etc/resolv.conf контейнера по умолчанию. Однако решение проблемы типа mongo-docker-alias.actual-intranet-domain.tld может быть проблематичным c, поскольку внешняя сеть и DNS не знают об этом поддомене. На самом деле мы обнаружили, что в нашем случае это все еще разрешается внутри контейнера, это заняло всего несколько секунд (против <1 мс обычно). А поскольку сервер пытается установить sh подключение к нескольким БД, он всегда работает в течение тайм-аута. * 10120 * * * * * * * * * * * * * * * * * * * * * * * * * Docker, к счастью, позволяет отклониться от поведения по умолчанию, включая настройку. пустое значение. Зная проблему, другой обходной путь должен заключаться в использовании псевдонимов docker с точкой в ​​нем, с тех пор не следует использовать <code>search, но мы не пробовали это.

Несколько вопросов остаются, но они не так важны. Как и в нашем случае, почему это произошло с обновлением Meteor, возможно, настоящая причина была в том, что изменилась и версия docker на хосте, поскольку мы не знали об изменении инфраструктуры. И вообще, почему docker добавляет эти записи в /etc/resolv.conf? Это не кажется очень полезным, но если это возможно, то есть вообще лучший подход для этого?

Очень полезное сообщение в блоге по этому вопросу было также опубликовано davd.io .

0 голосов
/ 15 февраля 2020

Проверьте файл /etc/mOngd.conf для привязки к сети. Возможно, вам придется разрешить ему отвечать на все сетевые интерфейсы, поскольку в сети может быть другой ip / su bnet при включении (или нет), что может объяснить, почему он работает в некоторых сценариях ios

...