Това се дължи на неразрешено 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 хост) няма да може да разреши тези имена. Можете да потвърдите това, като опитате да изпратите ping mongo1
от хоста на Docker.
Можете или да опитате да стартирате приложението от друг екземпляр на Docker, споделящ същата мрежа на Docker като набора реплики. Или променете мрежата на Docker като такава, за да разрешите имена на хостове, които могат да бъдат разрешени.
АКТУАЛИЗАЦИЯ:
Относно вашия коментар защо използвате mongo shell или PyMongo върши работа.
Това се дължи на разликата в режима на връзка. Когато посочвате единичен възел, т.е. mongodb://node1:27017
в shell или PyMongo не се извършва откриване на сървър. Вместо това той ще се опита да се свърже с този единичен възел (не като част от набор от реплики). Уловката е, че трябва да се свържете с основния възел на репликата, зададена за запис (трябва да знаете кой). Ако искате да се свържете като набор от реплики, трябва да дефинирате името на набора от реплики.
За разлика от mongo-go-driver
, по подразбиране ще извърши откриване на сървър и ще се опита да се свърже като набор от реплики. Ако искате да се свържете като единичен възел, тогава трябва да укажете connect=direct
в URI на връзката. Вижте също Пример за директно свързване