programing

Docker를 사용하는 MongoDB "첫 번째 연결 시 서버 [localhost:27017]에 연결하지 못했습니다."

mailnote 2023. 7. 5. 20:54
반응형

Docker를 사용하는 MongoDB "첫 번째 연결 시 서버 [localhost:27017]에 연결하지 못했습니다."

및 NodeJS 백엔드에서 mongoDB를 사용하고 있습니다.문제는 다음 오류가 발생한다는 것입니다.

노드:16) 처리되지 않은 약속거부 경고: MongoNetworkError: 첫 번째 연결 시 [localhost:27017] 서버에 연결하지 못했습니다 [MongoNetworkError: connectECONFUSED 127.0.0.1:27017]

이것은 제 도커 작품입니다.

version: '3.4'

services:
  db:
    image: mongo:latest
    ports:
      - '27017:27017'

  rest-api-node:
    build: .
    ports:
      - '5000:5000'
    links:
      - db
    restart: on-failure

와 해본 적이 있습니다.depends_on또한, 는 작동하지 않았습니다.

백엔드에서 나는 DB와 통신하기 위한 미들웨어로서 mongoose입니다. 이것이 나의 부분입니다.index.js

mongoose.Promise = global.Promise
mongoose.connect('mongodb://localhost/demo')
app.listen(port, () => console.log("live"))

저도 약속을 사용해봤지만, 변경은 없었습니다.저 좀 도와주세요.잘 부탁드립니다.

전체 오류 로그

pool.(/app/node_modules/mongodb-core/lib/topologies/server.js:505:11) rest-api-node_1 | at Pool.emit(이벤트.js:180:13) rest-api-node_1 | connection.(/app/node_modules/mongodb-core/lib/connection/pool.js:329:12) rest-api-node_1 | at Object.onceWrapper(이벤트.js:272:13) rest-api-node_1 | at Connection.emit(이벤트.js:180:13) rest-api-node_1 | api-node_1 | api-node/node.js(연결 객체:24.js.5.1) rest-node.js:272:13) rest-api-node_1 | at Socket.emit (event.js:180:13) rest-api-node_1 | at emitErrorNT(internal/streams/destroy.js:64:8) rest-api-node_1 | 프로세스 중입니다._tickCallback (internal/process/next_tick.js:178:19) rest-api-node_1 | 이름: 'MongoNetworkError', rest-api-node_1 |
메시지: '처음 연결할 때 [MongoNetworkError: connect ECONFUSED 127.0.0.1:27017] 서버에 연결하지 못했습니다.' }

기본적으로 작성은 앱에 대한 단일 네트워크를 설정합니다.서비스의 각 컨테이너는 기본 네트워크에 가입하고 해당 네트워크의 다른 컨테이너에서 모두 연결할 수 있으며 컨테이너 이름과 동일한 호스트 이름으로 검색할 수 있습니다.

당신의 말에 따르면docker-compose.yamlmongo 컨테이너에 액세스할 수 있는 파일:127.0.0.1:27017호스트 시스템에서만 사용할 수 있습니다.NodeJS 백엔드 컨테이너에서 액세스하려면 사용해야 합니다.db:27017.

저도 같은 문제가 있습니다. 다른 솔루션은 저에게 적합하지 않습니다. 하지만 저는 이런 식으로 했습니다.

참고:

의 경우 mongo를 .URI의 경우 MongoDB를 사용해야 합니다.service name에 신대127.0.0.1또는localhost

아래 , 도커버-깅파서일에이 my mongo 서비은름입니다.mongodb-myapp합니다.mongodb://mongodb-myapp:27017/myapp그리고 그것은 나에게 효과가 있습니다.


services:
  boilerplate-api-app:
    build: .
    environment:
      - MONGO_URI=mongodb://mongodb-myapp:27017/myapp
    volumes:
      - .:/app
    ports:
      - "5000:5000"
    depends_on:
      - mongodb-myapp

 mongodb-myapp:
    image: mongo
    ports:
      - "27017:27017"

저도 몇 시간 동안 이것에 갇혀 있었어요!db:27017 및 연문열및자에서restart: always에서.rest-api-node올바른 IP에 연결하고 노드 서버가 계속해서 DB에 연결을 시도하는지 확인합니다.나한테 효과가 있었어요!

도커식의

version: "3"
services:
  node-app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - PORT=3000
  mongo:
    image: mongo
    environment:
      - MONGO_INITDB_ROOT_USERNAME=imran
      - MONGO_INITDB_ROOT_PASSWORD=test_password
    volumes:
      - mongo-db:/data/db

volumes:
  mongo-db:

위의 코드는 도커 컴포지트입니다.yaml 파일과 MongoDB의 서비스 이름은 'mongo'입니다.컨테이너의 IP 주소를 수동으로 삽입할 필요가 없습니다.대신 MongoDB URI에 다음 샘플 코드와 같이 서비스 이름을 삽입합니다.

const express = require("express");
const mongoose = require("mongoose");

const app = express();
mongoose
  .connect("mongodb://imran:test_password@mongo:27017/?authSource=admin")
  .then(() => {
    console.log("Successfully connected to the DB");
  })
  .catch((e) => {
    console.log(e);
  });

const port = process.env.PORT || 3000;

// routes
app.get("/", (req, res) => {
  res.send("<h1>Running on Container!</h1>");
});

app.listen(port, () => console.log(`listening on port ${port}`));

MongoDB가 다른 자격 증명을 사용하여 포트 27017에서 이미(도커가 아닌 로컬에서) 실행되고 있으며 이는 도커에서 실행되는 데이터베이스보다 우선했기 때문에 이 문제가 발생했습니다.

이러한 경우 솔루션이 로컬 MongoDB를 죽이거나 포트를 변경하는 것입니다.

  ports:
    - "27018:27017"

언급URL : https://stackoverflow.com/questions/51011552/mongodb-on-with-docker-failed-to-connect-to-server-localhost27017-on-first-c

반응형