Почему именно MongoDB не может нормально «проброситься» в Docker-контейнер с хоста?
ОС хоста - Ubuntu.
Обратите внимание в каком именно направлении я хочу "пробросить монгу",
Итак, монго слушает именно на хосте - а вот подключиться к ней нужно из контейнера.
При этом решение не должно быть "огульным", потому что в том же самом приложении есть и еще связанное с сетью (правда, другие порты), и к примеру --net=host все это дело просто портит. Решение по возможности должно затрагивать только монгу.
Бьюсь над этой проблемой уже много часов. Объем геморроя немного поражает.
Например, сперва пытался подключаться монго-клиентом (mongocxx) через localhost, а localhost привязать к нужному IP через hosts (в контейнере, разумеется). Но эта идея просто провалилась. Дело в том, что --add-host работает криво, он только добавляет запись в hosts, но не удаляет дубли, которые для localhost как раз-таки имеются. А любые попытки настроить hosts во время сборки, перед запуском контейнера - проваливаются, потому что при запуске он зачем-то подменяется.
Зачем почтенные разработчики докера придумали такой --add-host - я нифига не понял.
Далее. В итоге я решил просто точно определить нужный IP - а для этого написал свои клиент и сервер на питоне и с ними экспериментировал.
Результат: IP этот - 172.17.0.1.
Т.е. если в докере клиент коннектится к 172.17.0.1, а сервер на хосте слушает 0.0.0.0, то все ок.
Так было с моим самописным клиент-сервером.
И я решил поднимать монгу на 0.0.0.0, а подключать пока что прямо к 172.17.0.1, а потом видно будет как сюда прикрутить локалхост - через iptables и т.д.
Но увы - даже это не сработало!
Тогда я убил службу монги, поднял свой питоний сервер на порту монги, запустил прожку с mongocxx в докере - и что бы вы думали? Приходят accept'ы!
Убил питоний сервер, запустил опять монгу - ошибка, не может подключиться. Опять питоний сервер - опять accept'ы приходят.
А с настоящей монгой - не работает. Чего вот ей не хватает...
Смотрю netstat -tlnp на хосте в обоих случаях - одно и то же... 0.0.0.0.
...Понятно, что можно раскопать еще дальше - сниффить все сегменты TCP в обоих случаях, разбирать по байтам, думать, пробовать еще варианты... Но, возможно, кто-то даст ответ быстрее?
UPD: На всякий случай, uri: "mongodb://172.17.0.1:27017/Loremipsum", по нему создается mongocxx::uri, а по нему mongocxx::client, без лишних параметров.
OnYourLips, Тогда с какого пня гемора столько?
Почему у докера нет нормальной опции, позволяющей перекинуть локалхост (или 127.0.0.1) вовне, только для одного порта.
Вообще докер совсем не радует. Заставили билдить в нем и запускать, в результате билд медленный + проблем таких вот куча.
Но главный сейчас вопрос - почему именно с монгой такое. И как раскопать. Поставить сниффер - а если там нет ничего явного на уровне TCP/IP? Мне тогда уже протокол самой монги копать?
На всякий случай, uri: "mongodb://172.17.0.1:27017/Loremipsum", по нему создается mongocxx::uri, а по нему mongocxx::client, без лишних параметров.
к юзабилити докера у меня у самого очень большие вопросы.
Общая идея сделать виртуалку со скриптами - хорошая. Но сам движок этой виртуалки дрянь.
Я бы на их месте (разработчиков докера, я не шучу) вообще сделал бы ее абстрактной от движков VM, и чтобы можно было развертывать как локальные, так и удаленные (VPS и DS) контейнеры и одинаково ими управлять. Причем, локальные как на базе произвольной виртуалки юзера, так и с жестко заданным образом ОС.
В моем случае я сильно страдаю от медленных билдов - плюсы, как известно, не сахар в этом плане - а у меня ноутбук за 20к и российский VPS (не DS), строю на нем, так и без докера не шибко быстро. В следующий раз надо не скупиться, отказаться от привычных и удобных сервисов аренды VPS (которые однако очень дохлые по быстродействию, да еще и админы жалуются на нагрузку на диск), и брать DS, но докер все равно все портит.
Про монгу уже ответили вам ниже.
Так у меня нет в конфиге ничего такого кроме bind_ip = 0.0.0.0
OnYourLips, Посмотрел tcp dump'ом. Все подключается, что-то отправляется, туда, сюда (тип PSH на сервер, потом PSH с сервера, потом на сервер без флагов), но вот все равно exception "no suitable servers" и этот такт из 3 сегментов опять повторяется, и так по кругу.
Попробовал подключиться вообще извне - к внешнему IP, и не mongocxx, а .NETовским коннектором - все подключается, создает БД (если ее не было).
Что за...
rustler2000, Не тыкай мне, школьник, и вне докера к локалхост нормально все подключается почему-то. Да и какие с ним могут быть проблемы? Качается из оф. репозитория.
rustler2000, Муж мой мне нескоро будет тыкать, однополые браки пока в России не собираются разрешать, а вот на твое хамство уже можно пожаловаться, тем более, что пользы-то от тебя нет - говоришь, драйвер неисправен, а вот я решил подключаться к внешнему IP из докера тем же драйвером - и все ок, выходит проблема в докере, а не монго-драйвере.
Andrey Tsvetkov, "Alternatively, set the net.bindIp setting to 0.0.0.0,:: to bind to all IP addresses."
Так я это и сделал, только не 0.0.0.0,:: а просто 0.0.0.0
И более того: "net.bindIp and net.bindIpAll are mutually exclusive. That is, you can specify one or the other, but not both."