1

レプリカ セットの 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 として公開します。

4

3 に答える 3

1

これに対する解決策を見つけました。基本的に、mongo クライアント (および私の場合はスプリング データ) にとって重要なのは、レプリカ セット メンバー自体によって報告されるアドレスです。初期接続文字列は、指定されたメンバーの 1 つがレプリカ セット構成の完全な詳細をクライアントに応答するまで走査されるシード リストにすぎません。

つまり、再試行のために記録される実際の IP と、レプリカ セットとの実際の将来のすべての対話は、クライアントがその構成を要求したときにレプリカ セットがクライアントに報告する内容によって決定されます。これは、レプリカ セット構成の内容によって決定されます。資料。

レプリカ セットは Docker コンテナーの IP を使用して開始されたため、これらはレプリカ セットの構成ドキュメントに記録され、起動時にアプリに報告された IP でした。 Docker IP が boot2docker VM の外部に公開されていないためです。

解決策 (私の場合) は、レプリカ セットの初期構成を変更して、ホスト マシンから開始されているかのようにメンバー IP を代わりに提供することでした (実際には、boot2docker マシンで公開されている別のポートにすぎません)。これは、config ドキュメント内のアドレスが、boot2docker 内のクライアントだけでなく、ホスト マシン上のすべてのクライアントから到達可能であることを意味していました。

于 2015-06-15T00:42:46.843 に答える
1

このチュートリアルに従って docker 経由で mongodb クラスターをセットアップした後、同様の問題に遭遇しました。このクラスターへの適切なレプリカ セット接続を開くことができるようにするために、手順に次の 2 つの変更を加えました。

  1. 専用の docker ネットワーク ブリッジを使用する代わりに、ホストされたネットワークを使用して、各ノードを (たとえば) 次のように開始します。

docker run -p 30001:30001 --name mongo1 --net ホスト mongo mongod --replSet rs1 --port 30001

(「--net host」はホスト ネットワークを使用するため、ホストで使用可能なポートを使用するには、ポートを再マッピングする必要があります。この設定でポート転送オプションが必要かどうかはよくわかりません)

  1. Docker マシンを使用して Windows で実行しているため、次を使用して vm の IP を取得しました。

docker-machine 環境

次に、その IP をレプリカ セット構成にプラグインします (この場合、VM の IP は 192.168.99.100 でした)。

config = {
      "_id" : "rs1",
      "members" : [
        {
          "_id" : 0,
          "host" : "192.168.99.100:30001"
        },
        {
          "_id" : 1,
          "host" : "192.168.99.100:30002"
        },
        {
          "_id" : 2,
          "host" : "192.168.99.100:30003"
        }
      ]
    }

明らかに、このセットアップ全体はテスト専用であり、本番用には設計されていません。

于 2016-09-22T11:57:36.750 に答える
-1

コンテナのIPアドレスでmongodを開始する必要があります

これを試してください: /usr/bin/mongod --auth --dbpath /data/db/ --replSet rs0 --bind_ip 172.17.0.34

172.17.0.34 はコンテナのアドレスです (mongod primairy)

于 2015-04-20T13:06:51.883 に答える