将连接到 MongoDb 的 Node.js 应用程序 Docker 化
亲爱的程序员们,大家好!欢迎阅读我关于Node.js和Docker 的技术文章系列。希望你喜欢!
问题:
你已经在本系列的上一篇文章中了解了如何将 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 .
是时候安装依赖项了。我们需要 express 和 mongoose 包。
npm i express mongoose
创建名为server.js
inside 根文件夹的文件。
另外,不要忘记在启动时更改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"
}
}
好的。让我们创建一个包含两个路由的基本 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}`);
});
你可以运行npm start
测试一下。如果看到“Listening on 8080 ”的消息,则表示一切正常。另外,打开http://localhost:8080并检查是否可以看到 hello 消息。
有个好东西叫nodemon。源代码发生任何更改时,它都会自动重建我们的项目。快来用用它吧!😀
npm install --save-dev nodemon
在 中添加一个新命令package.json
。以便我们使用它进行开发。
"scripts": {
"start": "node server.js",
"dev": "nodemon server.js"
},
现在使用npm run dev
开发时运行而不是npm start
。
npm run dev
你会注意到控制台里的变化,因为现在 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;
好!现在我们为文档数据库定义了一个模型。用户模型只有一个字符串类型的字段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;
请注意,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");
});
});
耶!🎉 我们把 Express 应用和本地 MongoDb 实例连接起来了!
3.实现对MongoDb的读写
我们应该实现两个用于读取和添加新用户的路由。
打开server.js
文件,首先在顶部导入我们的模型:
// server.js
const User = require("./src/User.model");
// ...
然后像这样实现下面这两条路线:
// 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");
});
// ...
注意,这里我们使用了 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
将以下内容粘贴到其中:
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" ]
我们可以使用这个命令简单地构建我们的快速应用程序
docker build -t mongo-app .
但是……这只能运行我们的 Express 应用,无法与 MongoDb 一起运行。这就是为什么我们需要一个docker-compose
文件。🐳
现在创建另一个文件docker-compose.yml
并粘贴以下内容:
version: "2"
services:
web:
build: .
ports:
- "8080:8080"
depends_on:
- mongo
mongo:
image: mongo
ports:
- "27017:27017"
我们在这个文件中定义了两个服务。一个是运行在 8080 端口的 Node 应用,另一个是 mongodb 实例。
⚠️ 在运行下一个命令之前,请确保已将文件中的连接字符串更改为 mongo db connection.js
。
const connection = "mongodb://mongo:27017/mongo-test";
我们将localhost替换为mongo,这非常重要。因为我们需要告诉应用程序,我们想要从 docker 内部虚拟网络而不是本地网络访问 MongoDb。
现在运行魔法命令🔮
docker-compose up
打开浏览器访问http://localhost:8080/users和http://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