TMDOG的微服务之路_08——使用Docker部署NestJS微服务

news2024/11/15 13:54:20

TMDOG的微服务之路_08——使用Docker部署NestJS微服务

博客地址:TMDOG的博客

在上一篇博客中,我们探讨了如何使用 NestJS 创建一个简单的微服务架构。为了将这些微服务部署到生产环境,我们可以使用 Docker 来打包和管理这些服务。本篇博客将详细介绍如何使用 Docker 和 Docker Compose 部署我们的 NestJS 微服务项目。

1. 为什么选择 Docker?

Docker 是一个开源的平台,允许开发者自动化地部署应用程序到轻量级、可移植的容器中。这些容器包含了运行应用所需的所有内容,包括代码、依赖项和系统库。因此,使用 Docker 可以确保在不同环境中运行应用的一致性,同时简化了部署和扩展的过程。

Docker 的主要优点:

  • 环境一致性:Docker 容器确保在开发、测试和生产环境中运行的应用程序保持一致,减少了“在我这里可以运行”的问题。
  • 隔离性:每个 Docker 容器在独立的环境中运行,避免了依赖冲突和资源争用。
  • 可移植性:Docker 容器可以在任何支持 Docker 的平台上运行,从而提高了应用的可移植性。
  • 轻量级:相比传统的虚拟机,Docker 容器占用资源更少,启动速度更快。

2. 使用 Docker 部署 NestJS 微服务

在这一部分,我们将通过 Dockerfile 和 Docker Compose 来打包和部署我们在上一篇博客中创建的三个微服务:api-gatewayservice_1service_2

2.1 编写 Dockerfile

我们为每个微服务编写了一个 Dockerfile,以便打包成 Docker 镜像。下面是三个模块的 Dockerfile 示例:

API Gateway 的 Dockerfile
# 使用官方的 Node.js 作为基础镜像
FROM node

# 创建工作目录
WORKDIR /usr/src/app

# 复制 package.json 和 package-lock.json 文件
COPY package*.json ./

# 安装依赖
RUN npm install --production

# 复制项目的所有文件到工作目录
COPY . .

# 编译 TypeScript
RUN npm run build

# 暴露 API 网关的端口
EXPOSE 3000

# 运行 API 网关
CMD ["npm", "run", "start:prod"]
Service_1 的 Dockerfile
# 使用官方的 Node.js 版本作为基础镜像
FROM node

# 创建工作目录
WORKDIR /usr/src/app

# 复制 package.json 和 package-lock.json 文件
COPY package*.json ./

# 安装依赖
RUN npm install --production

# 复制项目的所有文件到工作目录
COPY . .

# 编译 TypeScript
RUN npm run build

# 暴露服务端口
EXPOSE 3000

# 运行服务
CMD ["npm", "run", "start:prod"]
Service_2 的 Dockerfile
# 使用官方的 Node.js 版本作为基础镜像
FROM node

# 创建工作目录
WORKDIR /usr/src/app

# 复制 package.json 和 package-lock.json 文件
COPY package*.json ./

# 安装依赖
RUN npm install --production

# 复制项目的所有文件到工作目录
COPY . .

# 编译 TypeScript
RUN npm run build

# 暴露服务端口
EXPOSE 3000

# 运行服务
CMD ["npm", "run", "start:prod"]

2.2 编写 Docker Compose 文件

Docker Compose 允许我们通过一个配置文件同时管理多个 Docker 容器。我们为项目编写了一个 docker-compose.yaml 文件,以启动所有微服务。

version: '3'
services:
  service_1:
    build: ./microservice/service_1
    ports:
      - "50001:3000"
    networks:
      - microservices-network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:50001/health"]
      interval: 30s
      retries: 3
      start_period: 10s
      timeout: 10s

  service_2:
    build: ./microservice/service_2
    ports:
      - "50002:3000"
    networks:
      - microservices-network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:50002/health"]
      interval: 30s
      retries: 3
      start_period: 10s
      timeout: 10s

  api-gateway:
    build: ./api-gateway
    ports:
      - "3000:3000"
    depends_on:
      - service_1
      - service_2
    networks:
      - microservices-network

networks:
  microservices-network:
    driver: bridge
解释:
  • service_1service_2 分别映射到主机的 50001 和 50002 端口,并通过健康检查来确保服务的可用性。
  • api-gateway 作为微服务的入口,依赖于 service_1service_2,并且通过端口 3000 与外部通信。
  • microservices-network 是一个自定义的桥接网络,用于容器之间的通信。

2.3 使用脚本简化部署

为了简化在不同操作系统上的部署,我们编写了 Windows 和 Linux 的脚本:

Windows 脚本 (start.bat)
@echo off

REM Navigate to the root directory
cd /d %~dp0

REM Initialize service_1
echo Initializing Service 1...
cd microservice\service_1
call npm install
call npm run build

REM Initialize service_2
echo Initializing Service 2...
cd ..\service_2
call npm install
call npm run build

REM Initialize api-gateway
echo Initializing API Gateway...
cd ..\..\api-gateway
call npm install
call npm run build

REM Return to the root directory
cd /d %~dp0

REM Execute Docker Compose
echo Starting Docker containers...
call docker-compose up -d

echo Deployment completed.
pause
Linux 脚本 (start.sh)
#!/bin/bash

# Navigate to the script's directory
cd "$(dirname "$0")"

# Initialize service_1
echo "Initializing Service 1..."
cd microservice/service_1
npm install
npm run build

# Initialize service_2
echo "Initializing Service 2..."
cd ../service_2
npm install
npm run build

# Initialize api-gateway
echo "Initializing API Gateway..."
cd ../../api-gateway
npm install
npm run build

# Return to the root directory
cd ../../[nestjs_microservice_quickstart](https://github.com/TMDOG666/nestjs_microservice_quickstart)

# Execute Docker Compose
echo "Starting Docker containers..."
docker compose up -d

echo "Deployment completed."

在根目录的 package.json 文件中,我们定义了启动命令以方便操作:

{
  "name": "nestjs_microservice_quickstart",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "win": "start.bat",
    "linux": "chmod +x start.sh && start.sh"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "description": ""
}
运行命令:
  • Windows:npm run win
  • Linux:npm run linux

2.4 部署与测试

通过上述步骤,我们可以在本地环境中轻松部署和启动 NestJS 微服务。输入启动命令后,等待自动执行脚本即可。
等所有脚本跑完之后:
输入:

docker ps

我们发现3个容器已经创建好了:
请添加图片描述

浏览器中测试:
请添加图片描述
请添加图片描述
请添加图片描述

3. 总结

在本篇博客中,我们探讨了如何使用 Docker 和 Docker Compose 部署 NestJS 微服务架构。通过 Docker,将微服务打包为容器,并通过 Docker Compose 管理多个容器的启动,使得整个部署过程变得简单且高效。

如有任何问题或建议,欢迎在评论区留言。下一篇博客中,我们将继续探讨微服务架构的更多高级实践,敬请期待。

感谢阅读!

项目源码

项目源码已经上传至 GitHub,欢迎查看:nestjs_microservice_quickstart

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2070835.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker 数据卷的使用

Docker 数据卷的使用 文章目录 Docker 数据卷的使用导引1. 创建数据卷2. 查看创建的数据卷3. 查看数据卷的详细信息 导引 在Docker中,我们在创建并运行容器后,可以通过exec命令进入容器内部进行操作,但会发现一些命令是无法使用的&#xff0…

NSSCTF练习记录:[SWPUCTF 2021 新生赛]pigpig

题目: 根据题目名字和附件名提示,猜测为猪圈密码,对应手动解码 whenthepigwanttoeat

持久层接口开发

通常一个接口定义后,从持久层开始开发。 对于一个新模块需要使用工具生成模型类、mapper接口、mapper映射文件等,下边介绍一个工具用于自动生成代码。 1. 代码生成工具 1.1 安装插件 1.2 重启IDEA,连接mysql 1.3 配置代码生成规则 点击“c…

C++容器之字符串的详解

每日诗词: 我见青山我妩媚,料青山见我应如是。 ——《贺新郎甚矣吾衰矣》【宋】辛弃疾 目录 补漏: vector在分配新内存块后如何进行元素复制 正文: 字符串变量和常量 字符串变量: 解析: 字符串常量…

揭露 Sapiens:未来以人为中心的视觉任务

Sapiens | Meta Meta Reality Labs 隆重推出 Sapiens,这是一个尖端的模型系列,专为四种以人为中心的基本视觉任务而设计:二维姿态估计、身体部位分割、深度估计和表面法线预测。 我们的 Sapiens 模型可无缝处理 1K 高分辨率推理&#xff0c…

加州大学圣地亚哥分校 沉浸式遥操作机器人系统

想象一下,在VR中控制游戏角色时,你的手部动作能够无缝转化为角色的行动。如果将这种体验应用于现实世界中的双手机器人控制,将带来革命性的人机交互体验。随着Apple Vision Pro的问世,这一设想逐渐变为现实。然而,将这…

Velocity模板引擎——若依代码生成器

文章目录 快速入门准备模板数据填充运行代码 基础语法简单类型的变量获取对象类型的变量获取基础语法-循环基础语法—if判断 官网 比较擅长用于邮件,发票,web内容生成、代码生成、网页静态化 模板化的东西适合使用 当然模板引擎不止这一种,还…

记录|C# winform——Chart控件

目录 前言一、重点关注1.1 Chart控件效果1.2 属性1.2.0 位置讲解1.2.1 Titles——标题集合TextToolTip 1.2 .2 Series——图表序列ChartTypeLegends——图例集合 二、数据传入Chart控件2.1 如何传入数据?2.2 如果想限定每次展现的数据量怎么办? 三、标注…

主机安全-网络攻击监测

目录 概述暴力破解(SSH爆破为例)原理规则攻击模拟告警 端口扫描原理规则攻击模拟告警 流量劫持原理规则攻击模拟告警 参考 概述 本文介绍主机网络层面上的攻击场景,每种攻击场景举一个例子。监测方面以字节跳动的开源HIDS elkeid举例。 针对…

【2】搭建雅特力AT32F437ZMT OpenHarmony轻量系统开发环境

本文用于阐述如何搭建AT32F437ZMT OpenHarmony轻量系统开发环境开源组织地址:https://gitee.com/AT32437_OpenHarmony 1.AT-START-F437雅特力官方开发板相关资料 移植基于at32f437雅特力官方开发板AT-START-F437 AT-START-F437雅特力官方开发板相关资料 2.AT32F43…

采用不高于3次的勒让德多项式拟合原函数

利用勒让德多项式进行拟合的区域是[-1,1]&#xff0c;如果不是这个区域&#xff0c;比如是[a,b]&#xff0c;利用转化到[-1,1]。 参考以下例题计算系数 C语言代码如下 //用三阶的勒让德多项式进行拟合 #include<math.h> #include<stdio.h> #include "main.c…

智能控制,高效节能。ZLG致远电子能源智慧管理解决方案

面对楼宇及建筑群能源管理与设备控制的复杂需求&#xff0c;ZLG致远电子推出了一套能源智慧管理解决方案。该方案集设备管理、任务调度和数据可视化于一体&#xff0c;不仅实现数据的实时监控与分析&#xff0c;还助力系统节能降耗。 ZLG致远电子能源智慧管理解决方案 在ZLG致…

shallowReactive 与 shallowRef

除了之前的 ref与reactive 之外&#xff0c;Vue3 还准备了另外两个API&#xff0c;也是用来对响应式数据做处理&#xff0c;那就是 shallowReactive 与 shallowRef shallowReactive 文档解释&#xff1a;reactive() 的浅层作用形式&#xff0c;只能定义对象类型的数据。和 r…

pytorh基础知识和函数的学习:图像文件的Tensor

在深度学习和计算机视觉中&#xff0c;将图像文件转换为张量&#xff08;Tensor&#xff09;是数据预处理的重要步骤。Tensor 是一种多维数组&#xff0c;在 PyTorch 中&#xff0c;用于表示和处理数据。 首先&#xff0c;创建一个3*3的图像文件&#xff0c;放大之后&#xff…

终端防火墙软件功能 | 在终端设备上启用防火墙!终端安全小课堂开讲啦

终端设备的安全性直接关系到企业的整体网络安全&#xff0c;随着网络威胁的日益复杂和多样化&#xff0c;启用并合理配置终端防火墙软件是保障终端安全不可或缺的一环。 今天&#xff0c;我们将走进终端安全小课堂&#xff0c;详细解析安企神终端安全管理软件中的防火墙功能&a…

unity Android + WebGL 浏览器打开

1.切换为WebGL平台 2.打包的时候设置 3.放入FHS 手机打开这个链接即可 注意这是在局域网内

c++11异常

一、异常介绍 1、异常作用 异常是一种处理错误的方式&#xff0c;当一个函数发现自己无法处理的错误时就可以抛出异常&#xff0c;让函数的 直接或间接的调用者处理这个错误 2、异常操作 &#xff08;1&#xff09;throw 当问题出现时&#xff0c;程序会抛出一个异常。这是…

darnet 识别检测本地视频 保存本地视频

darnet 识别检测本地视频 保存本地视频 darknet的github下载 darknet的github下载 darknet地址 将这个下载后&#xff0c;保存在catkin_ws的src目录下

C语言 ——— 柔性数组

目录 柔性数组的概念以及定义 柔性数组的特点 柔性数组的使用 柔性数组的概念以及定义 概念&#xff1a; C99中&#xff0c;结构中的最后一个元素允许是未知大小的数组&#xff0c;这就叫柔性数组成员 定义&#xff1a; struct st_type {int i;int a[0]; //柔性数组成员…

rpmbuild构建mysql-boost-5.7.42版本的rpm包

系列文章目录 rpmbuild入门 文章目录 系列文章目录前言一、准备工作1、mysql-5.7.42源码包下载2、准备mycnf配置文件3、mysqld.server配置文件准备4、检查服务器的cmake版本和gcc版本5、服务器安装依赖 二、编译构建0、rpmbuild目录树示例1、spec文件拆分解释2、源码包解压部分…