レプリカ セットの 1 つのメンバーとして機能する Docker コンテナーがあります。これらのうちの 3 つを正常に起動し、それらをレプリカ セットとして接続するためにそれらの内部でいくつかのシェル スクリプトを実行することができました。ホストマシンから各メンバーに個別に接続できることがわかりましたが、boot2docker IP で各メンバーをリストすることにより (私の場合は spring-data-mongodb を介して) レプリカセットに接続しようとすると、それぞれのポートで、どこかでアプリケーションが各コンテナー IP の boot2docker IP を交換し、その IP に直接接続しようとしていることがわかりました。
これは、最初の接続文字列が単なるシード リストであり、実際の構成がメンバー自身との通信によって提供されるために発生すると想定しています。もちろん、これらの IP はホスト マシン (アプリが実行されている場所) には存在せず、boot2docker VM 内にのみ存在するため、これは問題です。メンバーが個々の到達不能 IP ではなく boot2docker IP を報告するようにするにはどうすればよいですか?
私はelasticsearchで似たようなものに出くわし、network.publish_host
変数を設定することで修正できました。mongodb にも同様の設定はありますか? おそらく bind_ip が正しいと思いましたが、それを機能させることができませんでした。間違って使用していますか? boot2docker IP に設定していたのですが、起動時にバインド エラーが発生しました。
また、ubuntu とネイティブ docker を実行している友人は問題なく接続できるため、これは boot2docker がミックスに投入された場合の問題にすぎないことを確認できます。
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
私のSpring 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 VM でそれらのポートを 27017、27018、および 27019 として公開します。