これは、未解決のhostnameが原因です。 Dockerホストから。 Dockerでは、インスタンスmongo1 、mongo2 、およびmongo3 それらの名前で到達可能です。ただし、これらの名前にはDockerホストからアクセスできません。これは次の行から明らかです:
Addr: mongo2:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo2: no such host
MongoDBドライバーはserver discoveryを試みます 与えられたレプリカセットメンバーから。レプリカセット内の他のすべてのノードを検索します( rs.conf
)。ここでの問題は、レプリカセットがmongo<N>という名前で設定されていることです。 、ドライバー(Dockerホストで実行)はこれらの名前を解決できません。これは、mongo1にpingを実行して確認できます。 Dockerホストから。
レプリカセットと同じDockerネットワークを共有する別のDockerインスタンスからアプリケーションを実行してみてください。または、解決可能なホスト名を許可するようにDockerネットワークを変更します。
更新:
mongo を使用する理由についてのコメントについて シェル、または PyMongo 動作します。
これは、接続モードの違いによるものです。単一のノードを指定する場合、つまりmongodb://node1:27017 シェルまたはPyMongoでは、サーバーの検出は行われません。代わりに、(レプリカセットとしてではなく)その単一ノードへの接続を試みます。問題は、書き込むレプリカセットのプライマリノードに接続する必要があることです(どちらを知っている必要があります)。レプリカセットとして接続する場合は、レプリカセット名を定義する必要があります。
mongo-go-driverとは対照的 、デフォルトでは、サーバー検出を実行し、レプリカセットとして接続を試みます。単一ノードとして接続する場合は、connect=directを指定する必要があります 接続URIで。 例のConnectDirect
も参照してください。