7
respostas

realizar comunicação entre conteiners de forma externa

Boa tarde a todos , ao configurar um conteiner docker com MongoDB e outro conteiner que vai fazer a comunicação com o mesmo via MongoUri , o mesmo gera um erro de codigo abaixo. Porém se faço o deploy em maquinas diferentes, o mesmo realiza a comunicação de forma correta. Podem me ajudar? Obs: Já conferi ip e porta do servidor e usuário estão ambos corretos. Só retirei da mensagem por questões de segurança

Connection error
app_1  | (node:27) UnhandledPromiseRejectionWarning: Error: read ECONNRESET
app_1  |     at TCP.onStreamRead (internal/stream_base_commons.js:205:27)
app_1  | (node:27) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
app_1  | (node:27) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
app_1  | /usr/src/app/node_modules/connect-mongodb-session/node_modules/mongodb/lib/topologies/server.js:240
app_1  |             throw err;
app_1  |             ^
app_1  | 
app_1  | Error: Error connecting to db: failed to connect to server ["IP_DO_SERVER":"PORTA"] on first connect [Error: read ECONNRESET
app_1  |     at TCP.onStreamRead (internal/stream_base_commons.js:205:27) {
app_1  |   name: 'MongoNetworkError',
app_1  |   errorLabels: [Array],
app_1  |   [Symbol(mongoErrorContextSymbol)]: {}
app_1  | }]
app_1  |     at /usr/src/app/node_modules/connect-mongodb-session/index.js:75:17
app_1  |     at /usr/src/app/node_modules/connect-mongodb-session/node_modules/mongodb/lib/utils.js:411:14
app_1  |     at executeCallback (/usr/src/app/node_modules/connect-mongodb-session/node_modules/mongodb/lib/utils.js:401:25)
app_1  |     at /usr/src/app/node_modules/connect-mongodb-session/node_modules/mongodb/lib/operations/mongo_client_ops.js:285:21
app_1  |     at connectCallback (/usr/src/app/node_modules/connect-mongodb-session/node_modules/mongodb/lib/operations/mongo_client_ops.js:265:5)
app_1  |     at /usr/src/app/node_modules/connect-mongodb-session/node_modules/mongodb/lib/operations/mongo_client_ops.js:353:14
app_1  |     at Server.<anonymous> (/usr/src/app/node_modules/connect-mongodb-session/node_modules/mongodb/lib/topologies/server.js:237:11)
app_1  |     at Object.onceWrapper (events.js:417:26)
app_1  |     at Server.emit (events.js:310:20)
7 respostas

Olá Zilllene, tudo bem? O IP que você está utilizando é o IP do servidor na rede local é isso? Bem, pode ser isso, quando você está executando os dois containers em máquinas diferentes, realmente você precisa usar o endereço IP da máquina na rede. Porém se você estiver executando ambos na mesma máquina, você pode usar o http://localhost, ou então o IP 127.0.01 ou se não der certo você pode usar o endereço IP padrão do Docker que geralmente é 172.17.0.1 e juntamente com a porta do container do MongoDB.

Fala pra gente se funcionou!

Boa tarde Jonilson, sim já realizei essa tentativa inclusive colocando o IP que o docker fornece ao conteiner e mesmo assim ocorre o mesmo erro, dái minha suspeita sobre o mongouri. Tentei com localhost, tentei com o IP fixo da maquina e mesmo assim nada, pelo nome , criei um DNS para tentar por nome tb rs , ambos sem sucesso.

Zilllene, como você subindo esses dois containers na mesma máquina? Você está usando o docker-compose ou apenas o docker mesmo? De ante mão você pode criar uma rede no Docker com o comando:

docker network create -d bridge minha-network

E depois subir ambos os containers nessa mesma rede da seguinte forma:

docker run -d -p 27017:27017 mongo --network=minha-network 

E também o seu container app:

docker run -d -p 80:80 app --network=minha-network

E fala pra gente o resultado!

Um outra solução é criar a rede com o comando:

docker network create -d bridge minha-network

E apenas conectar os containers existente nessa rede:

docker network connect minha-network <container-name>

E depois tentar acessar novamente! Você pode usar apenas o nome do container que o MongoDB está em execução.

Boa tarde desculpa a demora na resposta. Eu estou criando via docker compose somente a aplicação que irá acessar o conteiner com o mongo, já exsitente. porém a ideia é otima, vou testar adicionando a rede nova via docker-compose no app. Vou testar agora , já respondo se deu certo. Muito Obrigado por enquanto

Bom dia , Infelizmente mesmo assim não conectou. nem como localhost, nem como ip do conteiner 172.... , nem como ip externo. mais alguma dica?

Zilllene, não deu certo nem usando links no docker-compose? Algo mais ou menos assim:

version: "3"

volumes:
  data:

services:
  mysql:
    image: mysql:5.7
    ports:
      - "3306:3306"
    volumes:
      - data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=senha
      - MYSQL_DATABASE=banco

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    links:
      - mysql
    ports:
      - 80:80
    environment:
      - PMA_ARBITRARY=1

Note que no serviço do phpMyAdmin usei o link da seguinte forma:

    links:
      - mysql

Assim consigo acessar o MySQL usando apenas o nome mysql, você fez dessa forma também? Claro que no lugar do MySQL será o MongoDB e no lugar do phpMyAdmin será sua aplicação.