【问题标题】:Can't connect to mongo in Docker无法在 Docker 中连接到 mongo
【发布时间】:2021-11-21 16:38:55
【问题描述】:

我正在使用虚拟应用程序练习 Docker,但无法连接数据库。如果有人可以提供有关问题可能是什么的线索,请。提前感谢您的帮助。如果需要更多信息,请告诉我。

这是我用于 api 的 Dockerfile:

服务器中的 Dockerfile

FROM node:14-alpine

WORKDIR usr/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3400

CMD ["npm", "start"]

这是我在 db.js 中与 db 的连接

const mongoose = require('mongoose');

const uri = 'mongodb://mongo:27017/prueba-docker';
const connect = async () => {
  try {
    await mongoose.connect(uri, {});
    console.log('conected to db');
  } catch (err) {
    console.log('error connecting to db', err);
  }
};
module.exports = { connect };

这里是 docker-compose

version: "3"
services:
  prueba-react:
    image: prueba-react
    build: ./client/
    stdin_open: true
    ports: 
      - "3000:3000"
    networks: 
      - mern-app
  
  prueba-api:
    image: prueba-api
    build: ./server/
    ports: 
      - "3400:3400"
    networks:
      - mern-app
    depends_on:
      - db
  db:
    image: mongo:4.4-bionic
    ports:
      - "27017:27017"
    networks:
      - mern-app
    volumes:
      - mongo-data:/data/db

networks:
  mern-app:
    driver: bridge

volumes:
  mongo-data:
    driver: local

首先我发现我应该使用该命令停止 mongo,因为我遇到了端口冲突。

sudo systemctl stop mongod

但是现在我不明白为什么当我做 docker-compose up 时它会报错

这是我得到的错误

prueba-api_1    | error connecting to db MongooseServerSelectionError: getaddrinfo EAI_AGAIN mongo
prueba-api_1    |     at NativeConnection.Connection.openUri (/usr/app/node_modules/mongoose/lib/connection.js:796:32)
prueba-api_1    |     at /usr/app/node_modules/mongoose/lib/index.js:328:10
prueba-api_1    |     at /usr/app/node_modules/mongoose/lib/helpers/promiseOrCallback.js:32:5
prueba-api_1    |     at new Promise (<anonymous>)
prueba-api_1    |     at promiseOrCallback (/usr/app/node_modules/mongoose/lib/helpers/promiseOrCallback.js:31:10)
prueba-api_1    |     at Mongoose._promiseOrCallback (/usr/app/node_modules/mongoose/lib/index.js:1149:10)
prueba-api_1    |     at Mongoose.connect (/usr/app/node_modules/mongoose/lib/index.js:327:20)
prueba-api_1    |     at Object.connect (/usr/app/db.js:6:20)
prueba-api_1    |     at Object.<anonymous> (/usr/app/app.js:6:4)
prueba-api_1    |     at Module._compile (internal/modules/cjs/loader.js:1072:14) {
prueba-api_1    |   reason: TopologyDescription {
prueba-api_1    |     type: 'Unknown',
prueba-api_1    |     servers: Map(1) { 'mongo:27017' => [ServerDescription] },
prueba-api_1    |     stale: false,
prueba-api_1    |     compatible: true,
prueba-api_1    |     heartbeatFrequencyMS: 10000,
prueba-api_1    |     localThresholdMS: 15,
prueba-api_1    |     logicalSessionTimeoutMinutes: undefined
prueba-api_1    |   }

【问题讨论】:

    标签: node.js mongodb docker mongoose


    【解决方案1】:

    在您的docker-compose.yml 中,您正在创建一个名为mern-appnetwork,其中所有services 都分配给该network。要在docker network 中的containers 之间进行通信,您所要做的就是使用service 名称。尝试连接到mongodb://db:27017/prueba-docker,而不是mongodb://mongo:27017/prueba-docker

    您还提到了端口冲突。您似乎已经在运行mongodb。如果您不想在每次尝试docker-compose 时都停止mongodb,您可以映射到另一个端口:

        ports:
          - "27018:27017"
    

    或者,如果没有外部application 使用您的db,您可以根本不公开您的mongodb。这里只介绍security threats

    【讨论】:

    • 非常感谢,它工作得非常完美。我没有意识到这是一个愚蠢的错误。干杯!!
    猜你喜欢
    • 1970-01-01
    • 2018-09-02
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2020-08-08
    • 2018-09-24
    • 1970-01-01
    相关资源
    最近更新 更多