Docker 简介
Docker 是一个开源项目,它提供了一个轻量级的容器化环境来运行应用程序。Docker 的优点在于不需要对主机进行任何改动,即可在容器中运行应用程序。由于容器化技术的出现,开发者们不再需要担心环境不一致、依赖冲突等问题。
什么是微服务
微服务是一种基于服务拆分的架构风格。它将系统拆分成多个小型服务,每个服务都可以独立运行、部署、扩展和维护。每个服务都有自己的数据库,服务之间通过 RESTful API 进行通信。由于每个微服务的规模较小,因此可以通过 Docker 实现容器化,使得微服务更容易部署、管理和维护。微服务架构也使得系统更加灵活、可扩展、可维护,并且更加容易实现自动化部署和持续集成。
在 Docker 中构建 Node.js 微服务应用
Node.js 可以作为一种非常适合微服务的后端开发语言,本篇文章将介绍如何在 Docker 中构建一个 Node.js 微服务应用。我们将构建一个简单的 To-do List 应用,该应用包括两个微服务:一个是负责前端展示的 Web 服务,一个是负责后端数据存储和业务逻辑的 API 服务。
准备工作
在开始构建 Node.js 微服务应用之前,我们需要进行以下准备工作:
- 下载并安装 Docker
- 创建一个 Node.js 项目,并安装 Express 和 Mongoose
构建 Docker 镜像
为了在 Docker 中运行 Node.js 应用,我们需要首先构建 Docker 镜像。Docker 镜像是 Docker 容器的基础,它包含了应用程序、运行环境和所有依赖项。在进行 Docker 镜像构建之前,我们需要编写 Dockerfile 文件。
以下是一个简单的 Dockerfile 文件示例:
// javascriptcn.com 代码示例 # 使用官方的 Node.js 镜像作为基础 FROM node:14-alpine # 指定工作目录 WORKDIR /app # 拷贝应用程序代码到容器中 COPY . . # 安装依赖项和构建应用程序 RUN npm install && \ npm run build # 暴露端口 EXPOSE 3000 # 启动应用程序 CMD [ "npm", "run", "start" ]
在 Dockerfile 文件中,我们使用了官方的 Node.js 镜像作为基础镜像,并指定了工作目录、拷贝应用程序代码到容器中、安装依赖项和构建应用程序、暴露端口和启动应用程序等步骤。
接下来,在项目根目录下执行以下命令构建 Docker 镜像:
docker build -t my-node-app .
其中,-t 参数用于命名镜像,后面的 . 表示在当前目录下查找 Dockerfile 文件。
运行 Docker 容器
在成功构建 Docker 镜像之后,我们可以使用以下命令在 Docker 中运行容器:
docker run -p 3000:3000 --name my-node-container my-node-app
其中,-p 参数用于指定端口映射,--name 参数用于指定容器名称,my-node-app 是构建好的镜像名称。
构建微服务应用
在 Docker 中运行 Node.js 应用程序时,我们通常需要将应用程序拆分成多个微服务独立运行。为了构建 Node.js 微服务应用,我们将应用程序拆分成两个微服务:负责前端展示的 Web 服务和负责后端数据存储和业务逻辑的 API 服务。
Web 服务
Web 服务是用户访问的入口,它负责呈现 To-do List 列表和提供添加 To-do List 的页面。在 Web 服务中,我们将使用 Express 框架作为 HTTP 服务器,使用 EJS 模板引擎渲染视图。
以下是 Web 服务的代码:
// javascriptcn.com 代码示例 const express = require('express'); const ejs = require('ejs'); const axios = require('axios'); const app = express(); app.set('view engine', 'ejs'); app.get('/', async (req, res) => { const response = await axios.get('http://api:3001/api/todo'); const todoList = response.data; res.render('index', { todoList }); }); app.post('/todo', async (req, res) => { const { name } = req.body; await axios.post('http://api:3001/api/todo', { name }); res.redirect('/'); }); app.listen(3000, () => { console.log('Web service started on port 3000'); });
在以上代码中,我们首先引入了 Express、EJS 和 Axios 等模块,并将 Express 设置为 EJS 模板引擎。接下来,我们定义了两个路由:/ 和 /todo。
在 / 路由中,我们从后端 API 服务中获取 To-do List 数据,并将数据渲染到 EJS 模板中。在 /todo 路由中,我们从请求体中获取 To-do List 名称,然后将数据发送到后端 API 服务中进行添加。最后,我们使用 Express 监听 3000 端口,并打印出日志提醒 Web 服务已经成功启动。
API 服务
API 服务负责处理 HTTP 请求、与数据库交互以及处理业务逻辑。在 API 服务中,我们将使用 Express 框架作为 HTTP 服务器,使用 Mongoose 模块连接 MongoDB 数据库。
以下是 API 服务的代码:
// javascriptcn.com 代码示例 const express = require('express'); const mongoose = require('mongoose'); const bodyParser = require('body-parser'); const app = express(); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); mongoose.connect('mongodb://mongo/todo', { useNewUrlParser: true, useUnifiedTopology: true }); const todoSchema = new mongoose.Schema({ name: String }); const Todo = mongoose.model('Todo', todoSchema); app.get('/api/todo', async (req, res) => { const todoList = await Todo.find(); res.json(todoList); }); app.post('/api/todo', async (req, res) => { const { name } = req.body; const todo = new Todo({ name }); await todo.save(); res.json(todo); }); app.listen(3001, () => { console.log('API service started on port 3001'); });
在以上代码中,我们首先引入了 Express、Mongoose、Body Parser 等模块,并连接了名为 todo 的 MongoDB 数据库。接下来,我们定义了两个路由:/api/todo 和 /api/todo/:id。
在 /api/todo 路由中,我们使用 Mongoose 查询数据库中的所有 To-do List 数据,并将数据以 JSON 格式返回给前端 Web 服务。在 /api/todo/:id 路由中,我们从请求体中获取 To-do List 名称,然后将数据存储到 MongoDB 中。最后,我们使用 Express 监听 3001 端口,并打印出日志提醒 API 服务已经成功启动。
使用 Docker Compose 打包微服务应用
在运行 Node.js 微服务应用时,我们通常需要分别运行 Web 服务和 API 服务两个容器,并将它们连接起来。为了方便管理多个 Docker 容器,我们可以使用 Docker Compose 工具来打包和运行整个微服务应用。
以下是一个简单的 Docker Compose 文件示例:
// javascriptcn.com 代码示例 version: '3' services: web: build: . ports: - "3000:3000" api: build: . ports: - "3001:3001" depends_on: - mongo mongo: image: mongo:4 ports: - "27017:27017"
在以上代码中,我们定义了三个服务:web、api 和 mongo。web 服务和 api 服务使用同一个 Dockerfile 文件构建,分别映射到本地 3000 和 3001 端口。api 服务依赖于 mongo 容器,我们使用官方的 MongoDB 镜像作为依赖项,并将端口映射到本地的 27017 端口。
在项目根目录下执行以下命令启动 Docker Compose:
docker-compose up
此时,Docker Compose 将依次构建、启动和连接所有服务,并将整个微服务应用运行在 Docker 容器中。
总结
本篇文章介绍了如何使用 Docker 构建 Node.js 微服务应用。我们首先介绍了 Docker 和微服务两个概念,然后演示了如何使用 Docker 构建 Node.js 应用,并将应用拆分成多个微服务。最后,我们使用 Docker Compose 工具自动化打包和部署整个微服务应用。希望本篇文章可以帮助大家更好地理解 Docker、微服务以及如何在 Node.js 中应用这些技术。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6534f1fd7d4982a6eba9aa55