Cela est dû à un hostname
non résolu de l'hôte Docker. Dans Docker, les instances mongo1
, mongo2
, et mongo3
sont accessibles par ces noms. Cependant, ces noms ne sont pas accessibles depuis l'hôte Docker. Ceci est évident par cette ligne :
Addr: mongo2:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo2: no such host
Le pilote MongoDB tentera de server discovery
à partir d'un ou plusieurs membres du jeu de réplicas donnés ; il trouvera tous les autres nœuds dans le jeu de répliques (via rs.conf
). Le problème ici est que le jeu de répliques est défini avec le nom mongo<N>
, le pilote (exécuté sur l'hôte Docker) ne serait pas en mesure de résoudre ces noms. Vous pouvez le confirmer en essayant de faire un ping mongo1
de l'hôte Docker.
Vous pouvez soit essayer d'exécuter l'application à partir d'une autre instance Docker partageant le même réseau Docker que le jeu de répliques. Ou modifiez la mise en réseau Docker en tant que telle pour autoriser les noms d'hôte résolubles.
MISE À JOUR :
Concernant votre commentaire sur pourquoi utiliser mongo shell ou PyMongo œuvres.
Cela est dû à la différence de mode de connexion. Lors de la spécification d'un seul nœud, c'est-à-dire mongodb://node1:27017
en shell ou PyMongo, la découverte de serveur n'est pas effectuée. Au lieu de cela, il tentera de se connecter à ce nœud unique (et non dans le cadre d'un jeu de répliques). Le hic, c'est que vous devez vous connecter au nœud principal du jeu de répliques pour écrire (vous devez savoir lequel). Si vous souhaitez vous connecter en tant que jeu de répliques, vous devez définir le nom du jeu de répliques.
Contrairement au mongo-go-driver
, par défaut, il effectuerait la découverte du serveur et tenterait de se connecter en tant que jeu de réplicas. Si vous souhaitez vous connecter en tant que nœud unique, vous devez spécifier connect=direct
dans l'URI de connexion. Voir aussi Exemple Connect Direct