【问题标题】:MongooseServerSelectionError ECONNREFUSED with a docker-compose using mongo containerMongooseServerSelectionError ECONNREFUSED 与 docker-compose 一起使用 mongo 容器
【发布时间】:2021-11-22 14:27:45
【问题描述】:

我正在尝试在 Docker 中对我的 MERN 堆栈应用程序进行 docker 化,并且我能够使用带有 .yml 文件的 docker-compose 让所有服务在 docker 网络上的容器中运行,但由于某种原因,我的应用程序是无法连接到 mongo 服务。我能够让应用程序在我的本地主机上运行,​​但在 Docker 中,它无法运行。

Mongo 与后端 mongoose 的连接:

const mongoURI = `mongodb://${MONGOUN}:${MONGOPW}@mongodb:27018/names`;

mongoose.connect(mongoURI, { useUnifiedTopology: true, useNewUrlParser: true })
  .then(() => {
    console.log('mongo connection established');
  })
  .catch((error) => {
    console.log(`mongo connect error on ${mongoURI}`);
    console.log(error);
  });

const db = mongoose.connection;

db
  .then(() => {
    console.log(`connected to mongoose`);
  })
  .catch((err) => {
    console.log(`error connecting to mongoose`);
    console.log(err);
  });

docker-compose .yml 文件:

version: '3.1'
services:
  app:
    restart: always
    build: .
    ports:
      - 3000:3000
    links:
      - mongodb
  mongodb:
    image: mongo
    ports:
      - 27018:27018
    expose:
      - "27018"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password
      MONGO_INITDB_DATABASE: names
  mongo-express:
    image: mongo-express
    ports:
      - 8080:8081
    depends_on:
      - mongodb
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: admin
      ME_CONFIG_MONGODB_ADMINPASSWORD: password
      ME_CONFIG_MONGODB_SERVER: mongodb
    restart: unless-stopped

Dockerfile:

FROM node:14-alpine

RUN mkdir -p /home/app

COPY . /home/app

WORKDIR "/home/app"

EXPOSE 3000

CMD ["npm", "start"]

Docker 终端中的错误消息:

app_1      | connected to mongoose
app_1      | mongo connect error on mongodb://admin:password@mongodb:27018/names
app_1      | MongooseServerSelectionError: connect ECONNREFUSED 192.168.48.2:27018
app_1      |     at NativeConnection.Connection.openUri (/home/app/node_modules/mongoose/lib/connection.js:846:32)
app_1      |     at /home/app/node_modules/mongoose/lib/index.js:351:10
app_1      |     at /home/app/node_modules/mongoose/lib/helpers/promiseOrCallback.js:32:5
app_1      |     at new Promise (<anonymous>)
app_1      |     at promiseOrCallback (/home/app/node_modules/mongoose/lib/helpers/promiseOrCallback.js:31:10)
app_1      |     at Mongoose._promiseOrCallback (/home/app/node_modules/mongoose/lib/index.js:1149:10)
app_1      |     at Mongoose.connect (/home/app/node_modules/mongoose/lib/index.js:350:20)
app_1      |     at Object.<anonymous> (/home/app/server/db/index.js:7:10)
app_1      |     at Module._compile (internal/modules/cjs/loader.js:1085:14)
app_1      |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
app_1      |     at Module.load (internal/modules/cjs/loader.js:950:32)
app_1      |     at Function.Module._load (internal/modules/cjs/loader.js:790:12)
app_1      |     at Module.require (internal/modules/cjs/loader.js:974:19)
app_1      |     at require (internal/modules/cjs/helpers.js:93:18)
app_1      |     at Object.<anonymous> (/home/app/server/index.js:3:12)
app_1      |     at Module._compile (internal/modules/cjs/loader.js:1085:14) {
app_1      |   reason: TopologyDescription {
app_1      |     type: 'Single',
app_1      |     setName: null,
app_1      |     maxSetVersion: null,
app_1      |     maxElectionId: null,
app_1      |     servers: Map(1) { 'mongodb:27018' => [ServerDescription] },
app_1      |     stale: false,
app_1      |     compatible: true,
app_1      |     compatibilityError: null,
app_1      |     logicalSessionTimeoutMinutes: null,
app_1      |     heartbeatFrequencyMS: 10000,
app_1      |     localThresholdMS: 15,
app_1      |     commonWireVersion: null
app_1      |   }
app_1      | }

我刚刚开始学习 Docker,所以我主要在网上查看教程和其他示例。不过我在这里遇到了障碍。

这里是回购:https://github.com/nickhanrahan/shareport

任何人都可以在这里指出正确的方向吗?任何帮助将不胜感激。

【问题讨论】:

    标签: node.js mongodb docker mongoose docker-compose


    【解决方案1】:

    mongodb 使用端口 27017 而不是 27018

    version: '3.1'
    services:
      app:
        restart: always
        build: .
        ports:
          - 3000:3000
        links:
          - mongodb
      mongodb:
        image: mongo
        ports:
          - 27017:27017
        expose:
          - "27017"
        environment:
          MONGO_INITDB_ROOT_USERNAME: admin
          MONGO_INITDB_ROOT_PASSWORD: password
          MONGO_INITDB_DATABASE: names
      mongo-express:
        image: mongo-express
        ports:
          - 8080:8081
        depends_on:
          - mongodb
        environment:
          ME_CONFIG_MONGODB_ADMINUSERNAME: admin
          ME_CONFIG_MONGODB_ADMINPASSWORD: password
          ME_CONFIG_MONGODB_SERVER: mongodb
          ME_CONFIG_MONGODB_PORT: 27017
        restart: unless-stopped
    
    

    不要忘记server/db/index.js的变化

    const mongoURI = mongodb://${MONGOUN}:${MONGOPW}@mongodb:27017..

    【讨论】:

    • 谢谢,我试过了,我仍然得到同样的错误。需要注意的是,在我启动容器后,总是需要大约 30 秒才能记录此错误
    • 试试我的新答案
    • 好的,我现在收到一个身份验证错误:MongoError: Authentication failed.
    • 可能是因为 mongodb 没有创建 names 数据库。从 mongo express 127.0.0.1:8080 手动创建
    • 我不必手动创建数据库,但我可以通过在连接到 mongodb 时在选项配置中添加集合名称来使其工作,而不是在 URI 中添加它。我这样做了:const mongoURI = ``mongodb://${MONGOUN}:${MONGOPW}@mongodb:27017``;mongoose.connect(mongoURI, { useUnifiedTopology: true, useNewUrlParser: true, dbName: 'portfolios', }) 并且有效!谢谢
    猜你喜欢
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    • 2018-11-03
    • 2020-10-27
    • 2021-04-12
    • 2021-06-04
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多