将连接到 MongoDb 的 Node.js 应用程序 Docker 化

2025-06-07

将连接到 MongoDb 的 Node.js 应用程序 Docker 化

亲爱的程序员们,大家好!欢迎阅读我关于Node.jsDocker 的技术文章系列。希望你喜欢!

问题:

你已经在本系列的上一篇文章中了解了如何将 Docker 与 Node 结合使用。我知道我们都喜欢 MERN/MEAN 堆栈。下一步,我们将了解 Node 和 Mongo 在容器内运行时如何相互连接。开始吧!

1.本地安装MongoDb

是时候了解一些文档数据库的内容了。首先,从这里下载 MongoDb 服务器

如果您在安装过程中没有更改任何内容,它还应该安装一个名为MongoDb Compass Community 的东西。

这是一个非常棒的工具,可以用来检查、更改、添加或删除 MongoDb 集合中的数据。你可以使用默认地址和端口(如下图所示)连接到本地实例,也可以连接到任何其他服务器。

要本地连接,只需点击“连接”。在里面你可以看到一些默认集合,你可以随意操作一下。稍后我们会用到MongoDb Compass 。

2.通过 Express 应用连接 MongoDb

在本教程中,我将使用我最喜欢的编辑器 Visual Studio Code。您还需要安装Nodejs和 Docker。我使用的是 Windows 系统,因此我从这里下载了 Windows 版 Docker。

现在运行以下命令:



mkdir test-mongo-app && cd test-mongo-app && npm init -y && code .


Enter fullscreen mode Exit fullscreen mode

是时候安装依赖项了。我们需要 express 和 mongoose 包。



npm i express mongoose


Enter fullscreen mode Exit fullscreen mode

创建名为server.jsinside 根文件夹的文件。

另外,不要忘记在启动时更改package.json运行文件。server.js



{
  "name": "test-mongo-app",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1",
    "mongoose": "^5.6.1"
  }
}



Enter fullscreen mode Exit fullscreen mode

好的。让我们创建一个包含两个路由的基本 Express 应用。一个用于从数据库读取用户数据,另一个用于向其中添加虚拟用户数据。

首先检查快速服务器是否一切正常。



// server.js
const express = require("express");
const app = express();

const PORT = 8080;

app.get("/", (req, res) => {
  res.send("Hello from Node.js app \n");
});

app.listen(PORT, function() {
  console.log(`Listening on ${PORT}`);
});



Enter fullscreen mode Exit fullscreen mode

你可以运行npm start测试一下。如果看到“Listening on 8080 ”的消息,则表示一切正常。另外,打开http://localhost:8080并检查是否可以看到 hello 消息。

有个好东西叫nodemon。源代码发生任何更改时,它都会自动重建我们的项目。快来用用它吧!😀



npm install --save-dev nodemon


Enter fullscreen mode Exit fullscreen mode

在 中添加一个新命令package.json。以便我们使用它进行开发。



  "scripts": {
    "start": "node server.js",
    "dev": "nodemon server.js"
  },


Enter fullscreen mode Exit fullscreen mode

现在使用npm run dev开发时运行而不是npm start



npm run dev


Enter fullscreen mode Exit fullscreen mode

你会注意到控制台里的变化,因为现在 nodemon 正在监视项目中的任何更改,并在必要时重建它。修改一些内容server.js,你就会注意到 😉

现在src在项目根目录中创建文件夹。我们将在这里添加所有剩余的文件。

让我们为 Mongoose 创建一个 User 模型。创建文件名User.model.js



// User.model.js
const mongoose = require("mongoose");

const userSchema = new mongoose.Schema({
  username: {
    type: String
  }
});

const User = mongoose.model("User", userSchema);

module.exports = User;



Enter fullscreen mode Exit fullscreen mode

好!现在我们为文档数据库定义了一个模型。用户模型只有一个字符串类型的字段username。现在够了 :)

让我们添加一个名为connection.js“连接数据库”的文件。



// connection.js
const mongoose = require("mongoose");
const User = require("./User.model");

const connection = "mongodb://localhost:27017/mongo-test";

const connectDb = () => {
  return mongoose.connect(connection);
};

module.exports = connectDb;



Enter fullscreen mode Exit fullscreen mode

请注意mongo-test将是我们数据库(集群)的名称。

现在稍微修改一下server.js并启动应用程序。您应该在控制台中看到 MongoDb 已连接的消息。



// server.js
const express = require("express");
const app = express();
const connectDb = require("./src/connection");

const PORT = 8080;

app.get("/users", (req, res) => {
  res.send("Get users \n");
});

app.get("/user-create", (req, res) => {
  res.send("User created \n");
});

app.listen(PORT, function() {
  console.log(`Listening on ${PORT}`);

  connectDb().then(() => {
    console.log("MongoDb connected");
  });
});




Enter fullscreen mode Exit fullscreen mode

耶!🎉 我们把 Express 应用和本地 MongoDb 实例连接起来了!

3.实现对MongoDb的读写

我们应该实现两个用于读取和添加新用户的路由。
打开server.js文件,首先在顶部导入我们的模型:



// server.js
const User = require("./src/User.model");
// ...


Enter fullscreen mode Exit fullscreen mode

然后像这样实现下面这两条路线:



// server.js
app.get("/users", async (req, res) => {
  const users = await User.find();

  res.json(users);
});

app.get("/user-create", async (req, res) => {
  const user = new User({ username: "userTest" });

  await user.save().then(() => console.log("User created"));

  res.send("User created \n");
});
// ...


Enter fullscreen mode Exit fullscreen mode

注意,这里我们使用了 async/await 模式。如果你对此感兴趣,可以在这里找到。

基本上,我们实现了两条路线/users/user-create。✋ 是的,是的,我知道创建应该通过 POST http 动词完成,但只是为了使测试更容易,并避免为数据库配置种子方法。

现在是时候测试了!🔍 在浏览器中打开此链接http://localhost:8080/user-create,在数据库中创建一个虚拟用户记录。打开此链接http://localhost:8080/users,即可在浏览器中获取所有用户的 JSON 数据。

完成后,您可以返回 MongoDb Compass 并在此处检查用户集合。您应该看到以下内容:

4. Docker化Node和MongoDb

将 Docker 文件添加到根文件夹。



touch Dockerfile


Enter fullscreen mode Exit fullscreen mode

将以下内容粘贴到其中:



FROM node:8
# Create app directory
WORKDIR /usr/src/app
# Install app dependencies
COPY package*.json ./

RUN npm install
# Copy app source code
COPY . .

#Expose port and start application
EXPOSE 8080
CMD [ "npm", "start" ]


Enter fullscreen mode Exit fullscreen mode

我们可以使用这个命令简单地构建我们的快速应用程序



docker build -t mongo-app .


Enter fullscreen mode Exit fullscreen mode

但是……这只能运行我们的 Express 应用,无法与 MongoDb 一起运行。这就是为什么我们需要一个docker-compose文件。🐳

现在创建另一个文件docker-compose.yml并粘贴以下内容:



version: "2"
services:
  web:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - mongo
  mongo:
    image: mongo
    ports:
      - "27017:27017"



Enter fullscreen mode Exit fullscreen mode

我们在这个文件中定义了两个服务。一个是运行在 8080 端口的 Node 应用,另一个是 mongodb 实例。

⚠️ 在运行下一个命令之前,请确保已将文件中的连接字符串更改为 mongo db connection.js



const connection = "mongodb://mongo:27017/mongo-test";


Enter fullscreen mode Exit fullscreen mode

我们将localhost替换为mongo,这非常重要。因为我们需要告诉应用程序,我们想要从 docker 内部虚拟网络而不是本地网络访问 MongoDb。

现在运行魔法命令🔮



docker-compose up


Enter fullscreen mode Exit fullscreen mode

打开浏览器访问http://localhost:8080/usershttp://localhost:8080/user-create即可查看我们的应用程序在 Docker 中运行。

(如果一切不起作用,请尝试停止/删除图像和容器,通过再次破坏 docker compose-up 来重建它,如果 mongo 图像未从 hub 中提取,请尝试重新登录 docker hub 或重新启动 Windows 版 docker)

源代码请见此处。尽情享用吧!


🚀 如果你从那篇文章中读到了什么有趣的内容,请点赞并关注我,我会分享更多文章。谢谢你,亲爱的程序员!😏

文章来源:https://dev.to/vguleaev/dockerize-a-node-js-app-connected-to-mongodb-5bp1
PREV
正则表达式需要 5 天才能运行。所以我开发了一个工具,可以在 15 分钟内完成。
NEXT
我为什么要离开 Linux