首页 > 解决方案 > 如何让 docker 下运行的 nodejs 服务器通过 mongoose 连接到 mongodb?

问题描述

我正在努力尝试通过 mongoose 将我的 nodejs 服务器(在 docker 容器中运行)连接到 mongodb

server.js:

import * as express from 'express';
import { Request, Response } from 'express';
import { encode } from 'jwt-simple';
import * as bcrypt from 'bcrypt';
import { connect } from 'mongoose';
import { UserModel, User } from './models';

const app: express.Application = express();
const PORT = 3333;

app.use(express.json());

app.use((req, res, next) => {
  res.header("Access-Control-Allow-Origin", "*")
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
  next();
});

// some code here

connect(`mongodb://0.0.0.0:27017/user-db`, {
  useNewUrlParser: true,
  useUnifiedTopology: true
})
.then(() => {
  console.log('successfully connected to the database');
})
.catch(err => {
  console.log('error connecting to the database');
  process.exit();
});

app.listen(PORT, () => {
  console.log(`Server is listening at port - ${PORT}`);
});

然后我有两个图像,一个用于服务器,一个用于 mongodb,在运行 mongodb 图像后,我运行服务器一个,它被服务(已经从 .ts 编译)到 docker,然后我运行:

1 docker run -it --name server -p 3333:3333 my:server sh

然后在“服务器”容器中运行:

2 node server.js

服务器路由工作正常,但几秒钟后mongoose.connect陷入困境

标签: node.jsmongodbdockermongoose

解决方案


您有两个选项可以连接 Mongo DB 容器。

  • 主机 IP(运行 Mongo DB 容器的位置)
  • 相同的 Docker 网络

对于第一个选项,您可以将Host IP作为环境变量传递给您的 nodejs 容器,因为这0.0.0.0意味着 @David 提到的所有接口在这种情况下都不起作用。进行以下更改

// set some default value if ENV is not set
const mongo_host=process.env.MONGO_HOST || "localhost"

connect(mongo_host, {
  useNewUrlParser: true,
  useUnifiedTopology: true
})

然后运行容器并传递 Mongo 主机 IP

docker run -it -e MONGO_HOST=192.168.x.x --name server -p 3333:3333 my:server sh

或者如果主机是 Mac 或窗口,你也使用特殊的 DNShost.docker.internal


connect('host.docker.internal', {
  useNewUrlParser: true,
  useUnifiedTopology: true
})
  • 第二个选项是 Docker 网络
version: "3"
services:
  app:
    container_name: nodejs-mongo
    image: nodejs_app
    environment:
      - MONGO_HOST=mongo
    ports:
      - "3000:3000"
    depends_on:
      - mongo
  mongo:
    container_name: mongo
    image: mongo
    ports:
      - "27017:27017"

在这种情况下,我们通过MONGO_HOST=mongo哪个 docker 可以解决这个问题,以便与同一网络中的 Mongo 容器连接。

docker-compose 网络


推荐阅读