Ini karena hostname
yang belum terselesaikan dari tuan rumah Docker. Di Docker, instance mongo1
, mongo2
, dan mongo3
dapat dijangkau dengan nama-nama itu. Namun, nama-nama ini tidak dapat dijangkau dari host Docker. Ini terbukti dengan baris ini:
Addr: mongo2:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo2: no such host
Driver MongoDB akan mencoba server discovery
dari anggota set replika yang diberikan; itu akan menemukan semua node lain dalam set replika (melalui rs.conf
). Masalahnya di sini adalah set replika diatur dengan nama mongo<N>
, driver (dijalankan di Docker Host) tidak akan dapat menyelesaikan nama-nama ini. Anda dapat mengonfirmasi ini dengan mencoba melakukan ping ke mongo1
dari tuan rumah Docker.
Anda dapat mencoba menjalankan aplikasi dari instance Docker lain yang berbagi jaringan Docker yang sama dengan set replika. Atau, ubah jaringan Docker sedemikian rupa untuk mengizinkan nama host yang dapat dipecahkan.
PEMBARUAN:
Mengenai komentar Anda tentang mengapa menggunakan mongo shell, atau PyMongo bekerja.
Ini karena perbedaan mode koneksi. Saat menentukan satu simpul, yaitu mongodb://node1:27017
di shell atau PyMongo, penemuan server tidak dilakukan. Alih-alih, ia akan mencoba terhubung ke simpul tunggal itu (bukan sebagai bagian sebagai set replika). Tangkapannya adalah Anda harus terhubung ke simpul utama dari set replika untuk menulis (Anda harus tahu yang mana). Jika Anda ingin terhubung sebagai kumpulan replika, Anda harus menentukan nama kumpulan replika.
Berbeda dengan mongo-go-driver
, secara default ia akan melakukan penemuan server dan mencoba menyambung sebagai kumpulan replika. Jika Anda ingin terhubung sebagai node tunggal, maka Anda perlu menentukan connect=direct
dalam koneksi URI. Lihat juga Contoh Connect Direct