У меня есть докер-контейнер, который действует как единственный член набора реплик. Я могу успешно запустить три из них и запустить в них несколько сценариев оболочки, чтобы соединить их вместе как набор реплик. Я обнаружил, что могу подключиться к каждому из участников индивидуально с моего хост-компьютера, однако, когда я пытаюсь подключиться к набору реплик (в моем случае через spring-data-mongodb), перечисляя каждого члена на IP-адресе boot2docker и соответствующий порт, я обнаружил, что где-то приложение обменивается IP-адресом boot2docker для каждого IP-адреса контейнера и пытается подключиться напрямую к этому IP-адресу.
Я предполагаю, что это происходит потому, что начальная строка подключения - это просто начальный список, а затем фактическая конфигурация обеспечивается посредством связи с самими участниками. Это, конечно, проблема, потому что эти IP-адреса не существуют на хост-машине (где запущено приложение), а только внутри виртуальной машины boot2docker. Как я могу заставить участников сообщать IP-адрес boot2docker вместо своих индивидуальных недоступных IP-адресов?
Я столкнулся с чем-то похожим с elasticsearch и смог исправить это, установив переменную network.publish_host
. Есть ли аналогичная настройка для mongodb? Я думал, что, возможно, bind_ip был правильным, но не смог заставить эту работу, я использую это неправильно? Я устанавливал его на IP-адрес boot2docker и при запуске получал ошибку привязки.
Кроме того, я могу подтвердить, что это проблема только с boot2docker, добавленным в микс, поскольку мои друзья, использующие ubuntu и собственный докер, могут нормально подключаться.
Вот ошибка, которую я вижу при попытке установить свой bind_ip на boot2docker vm:
Starting mongod process using command: /usr/bin/mongod --storageEngine wiredTiger --auth --dbpath /data/db/ --replSet rs0 --bind_ip 127.0.0.1,192.168.59.103 --keyFile /mongodb-keyfile
2015-04-19T16:34:41.123+0000 E NETWORK [initandlisten] listen(): bind() failed errno:99 Cannot assign requested address for socket: 192.168.59.103:27017
Вот моя строка подключения в моем весеннем xml:
<mongo:mongo id="mongo" replica-set="192.168.59.103:27017,192.168.59.103:27018,192.168.59.103:27019"/>
Вот ошибка, которую видит мое приложение (если я просто начал что-то, не пытаясь изменить bind_ip и т. Д.)
Client view of cluster state is {type=ReplicaSet, servers=[{address=172.17.0.34:27017, type=Unknown, state=Connecting}, {address=172.17.0.35:27017, type=Unknown, state=Connecting}, {address=172.17.0.36:27017, type=Unknown, state=Connecting}]
at com.mongodb.BaseCluster.getServer(BaseCluster.java:82) ~[mongo-java-driver-2.13.0.jar:na]
Эти IP-адреса являются IP-адресами каждого контейнера, и каждый контейнер действительно запускается на порту 27017, но затем я публикую их порты на виртуальной машине boot2docker как 27017, 27018 и 27019.