これは、未解決の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
も参照してください。