簡體   English   中英

MongoDB 與 Docker “首次連接時無法連接到服務器 [localhost:27017]”

[英]MongoDB on with Docker "failed to connect to server [localhost:27017] on first connect "

我正在使用帶有 NodeJS 后端的 mongoDB。 問題是我收到以下錯誤

node:16) UnhandledPromiseRejectionWarning: MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]

這是我的 docker-compose

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 ,但沒有工作。

在后端,我是貓鼬作為與數據庫通信的中間件。 這是我的index.js的一部分

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

我也嘗試過使用 promise ,但沒​​有任何變化。 請幫幫我。 提前致謝

完整的錯誤日志

在游泳池。 (/app/node_modules/mongodb-core/lib/topologies/server.js:505:11) rest-api-node_1 | 在 Pool.emit (events.js:180:13) rest-api-node_1 | 在連接處。 (/app/node_modules/mongodb-core/lib/connection/pool.js:329:12) rest-api-node_1 | 在 Object.onceWrapper (events.js:272:13) rest-api-node_1 | 在 Connection.emit (events.js:180:13) rest-api-node_1 | 在套接字。 (/app/node_modules/mongodb-core/lib/connection/connection.js:245:50) rest-api-node_1 | 在 Object.onceWrapper (events.js:272:13) rest-api-node_1 | 在 Socket.emit (events.js:180:13) rest-api-node_1 | 在 emitErrorNT (internal/streams/destroy.js:64:8) rest-api-node_1 | 在 process._tickCallback (internal/process/next_tick.js:178:19) rest-api-node_1 | 名稱:'MongoNetworkError',rest-api-node_1 |
消息:'第一次連接時無法連接到服務器 [localhost:27017] [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017]'}

默認情況下, Compose 會為您的應用程序設置一個網絡。 服務的每個容器都加入默認網絡,並且可以被該網絡上的其他容器訪問,並且可以通過與容器名稱相同的主機名被它們發現。

根據您docker-compose.yaml文件,您只能從主機訪問127.0.0.1:27017上的 mongo 容器。 為了從 NodeJS 后端容器訪問它,您應該使用db:27017

我有同樣的問題,其他解決方案對我不起作用,但我是這樣做的

筆記 :

對於 mongo URI,您必須使用 MongoDB service name而不是127.0.0.1localhost

例如,在下面的 docker-compose 文件中,我的 mongo 服務名稱是mongodb-myapp並且我像這樣更改 URI 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:27017restart: alwaysrest-api-node上確保您連接到正確的 IP 並確保節點服務器繼續嘗試連接到您的數據庫。 這對我有用!

改變這個

mongoose.connect('mongodb://localhost:27017/dbName', { useNewUrlParser: true });

對此

mongoose.connect('mongodb://db:27017/dbName', { useNewUrlParser: true }); // docker-compose service name

更改localhost127.0.0.1mongoose.connect到您的碼頭工人,撰寫服務名稱。

docker-compose.yaml

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:

上面的代碼是 docker-compose.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}`));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM