Isso ocorre devido a
hostname
não resolvido do host Docker. No Docker, as instâncias mongo1
, mongo2
e mongo3
são alcançáveis por esses nomes. No entanto, esses nomes não podem ser acessados pelo host do Docker. Isso fica evidente nesta linha:Addr: mongo2:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo2: no such host
O driver MongoDB tentará a
server discovery
de determinado(s) membro(s) do conjunto de réplicas; ele encontrará todos os outros nós dentro do conjunto de réplicas (via rs.conf
). O problema aqui é que o conjunto de réplicas é definido com o nome mongo<N>
, o driver (executado no host do Docker) não poderá resolver esses nomes. Você pode confirmar isso tentando pingar mongo1
do host Docker. Você pode tentar executar o aplicativo de outra instância do Docker compartilhando a mesma rede do Docker que o conjunto de réplicas. Ou modifique a rede do Docker como tal para permitir nomes de host resolvíveis.
ATUALIZAR:
Em relação ao seu comentário sobre por que usar mongo shell ou PyMongo funciona.
Isso se deve à diferença no modo de conexão. Ao especificar um único nó, ou seja,
mongodb://node1:27017
no shell ou no PyMongo, a descoberta do servidor não está sendo feita. Em vez disso, ele tentará se conectar a esse nó único (não como parte de um conjunto de réplicas). O problema é que você precisa se conectar ao nó primário do conjunto de réplicas para gravar (você precisa saber qual). Se você quiser se conectar como um conjunto de réplicas, deverá definir o nome do conjunto de réplicas. Ao contrário do
mongo-go-driver
, por padrão, ele realizaria a descoberta do servidor e tentaria se conectar como um conjunto de réplicas. Se você quiser se conectar como um único nó, precisará especificar connect=direct
no URI de conexão. Consulte também Exemplo de conexão direta