Důvodem je nevyřešený hostname
z hostitele Docker. V Dockeru jsou instance mongo1
, mongo2
a mongo3
jsou pod těmito jmény dosažitelné. Tato jména však nejsou dostupná z hostitele Docker. To je zřejmé z tohoto řádku:
Addr: mongo2:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo2: no such host
Ovladač MongoDB se pokusí server discovery
z daného členu(ů) sady replik; najde všechny ostatní uzly v sadě replik (přes rs.conf
). Problém je v tom, že sada replik je nastavena na název mongo<N>
, ovladač (spuštěný v hostiteli Docker) nebude schopen tyto názvy přeložit. Můžete to potvrdit pokusem o ping mongo1
z hostitele Docker.
Můžete buď zkusit spustit aplikaci z jiné instance Docker sdílející stejnou síť Docker jako sada replik. Nebo upravte síť Docker jako takovou, aby umožňovala rozlišitelné názvy hostitelů.
AKTUALIZACE:
Pokud jde o váš komentář, proč používat mongo shell nebo PyMongo funguje.
To je způsobeno rozdílem v režimu připojení. Při zadávání jednoho uzlu, tj. mongodb://node1:27017
v shellu nebo PyMongu se zjišťování serveru neprovádí. Místo toho se pokusí připojit k tomuto jedinému uzlu (nikoli jako součást sady replik). Háček je v tom, že se pro zápis musíte připojit k primárnímu uzlu sady replik (musíte vědět, který). Pokud se chcete připojit jako sada replik, musíte definovat název sady replik.
Na rozdíl od mongo-go-driver
, ve výchozím nastavení provede zjišťování serveru a pokusí se připojit jako sadu replik. Pokud se chcete připojit jako jeden uzel, musíte zadat connect=direct
v URI spojení. Viz také Přímý příklad připojení