Detta beror på olöst hostname
från Docker-värd. I Docker, instanserna mongo1
, mongo2
och mongo3
kan nås med dessa namn. Dessa namn är dock inte tillgängliga från Docker-värden. Detta framgår av denna rad:
Addr: mongo2:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo2: no such host
MongoDB-drivrutinen kommer att försöka server discovery
från en given replikuppsättningsmedlem; den kommer att hitta alla andra noder inom replikuppsättningen (via rs.conf
). Problemet här är att replikuppsättningen är satt med namnet mongo<N>
, skulle drivrutinen (körs i Docker-värden) inte kunna lösa dessa namn. Du kan bekräfta detta genom att försöka pinga mongo1
från Docker-värd.
Du kan antingen prova att köra programmet från en annan Docker-instans som delar samma Docker-nätverk som replikuppsättningen. Eller ändra Docker-nätverket som sådant för att tillåta lösbara värdnamn.
UPPDATERING:
Angående din kommentar om varför du använder mongo shell, eller PyMongo Arbetar.
Detta beror på skillnaden i anslutningsläge. När du anger en enskild nod, dvs. mongodb://node1:27017
i shell eller PyMongo görs inte serverupptäckt. Istället kommer den att försöka ansluta till den enda noden (inte som en del som en replikuppsättning). Haken är att du måste ansluta till replikuppsättningens primära nod för att skriva (du måste veta vilken). Om du vill ansluta som en replikuppsättning måste du definiera replikuppsättningens namn.
I motsats till mongo-go-driver
, som standard skulle den utföra serverupptäckt och försöka ansluta som en replikuppsättning. Om du vill ansluta som en enda nod måste du ange connect=direct
i anslutnings-URI. Se även Example Connect Direct