首页 > 其他分享 >TMDOG的微服务之路_08——使用Docker部署NestJS微服务

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

时间:2024-08-24 15:50:45浏览次数:6  
标签:npm run service 08 echo NestJS Docker build

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

标签:npm,run,service,08,echo,NestJS,Docker,build
From: https://blog.csdn.net/m0_74139496/article/details/141500411

相关文章

  • Docker中镜像文件的打包传输、容器导出镜像及虚拟机端口映射的实现
    内网私有仓库1、Docker私有仓库是集中存放镜像的地⽅,⽽注册服务器(Registry)是存放仓库的具体服务器。仓库可以被认为是⼀个具体的项⽬或⽬录。Docker公共仓库:https://hub.docker.com2、Docker私有仓库的作⽤:1)镜像上传到公共仓库不⽅便管理,且仅需要局域⽹⽤户之间传递......
  • SpringBoot医疗废物管理系统 项目编号:200082(案例分析)
    摘  要随着医疗废物管理的重要性日益凸显,如何高效管理和处理医疗废物成为医疗机构面临的挑战。该系统涵盖存储间主管、运输员用户、处理地主管和管理员四个角色,旨在实现医废信息管理、出入库记录、运输信息跟踪、处理地信息管理等功能。通过技术手段提升医疗废物管理......
  • 2024-08-24:用go语言,给定一个下标从1开始,包含不同整数的数组 nums,数组长度为 n。 你需
    2024-08-24:用go语言,给定一个下标从1开始,包含不同整数的数组nums,数组长度为n。你需要按照以下规则进行n次操作,将数组nums中的所有元素分配到两个新数组arr1和arr2中:1.首先将nums中第一个元素加入arr1。2.然后将nums中第二个元素加入arr2。3.如果arr1的最后一......
  • docker 修改容器内容后更新镜像的流程
    在Docker中,如果你修改了一个容器的内容并希望将这些更改保存为一个新的镜像,可以按照以下步骤进行:dockerversion:26.11.确保容器运行首先,确保你正在修改的容器是运行中的。如果容器已经停止,你需要启动它:dockerstart<container_id>2.进入容器并进行修改(如果尚未修改)你......
  • 利用DockerDesktop在Win10下搭建Gitlab
    前言之前尝试过直接通过DockerDesktop来搭建Gitlab,但是最终因为稳定性、数据安全、数据备份的问题,还是选择了在Linux服务器上搭建正式的gitlab,仅记录这样的一个过程。个人建议这里需要注意两点:1、操作系统的版本经过我个人尝试,如果是使用win10的话,建议使用1809版本以上的操作系......
  • 导入导出DockerDesktop软件里的images镜像
    前言一、导出查看已有imagesPSC:\WINDOWS\system32>dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEpengzhile/pandoralatest43f234c4e8a85daysago250MBtwang2218/gitlab-ce-zh11.1.41935cc9f87984......
  • 2024/08/24 每日一题
    LeetCode3146两个字符串的排列差方法1:模拟+标记数组(哈希表)classSolution{publicintfindPermutationDifference(Strings,Stringt){int[]idx=newint[26];intn=s.length(),ans=0;for(inti=1;i<=n;i++){......
  • Terraform - 实践Terraform - Docker
    CreateTerraforminfrastructurewithDockerHowtoinit/plan/apply/destroyanNGINXwebserverwithTerraform.create.tffiles.terraform.tfThisfileincludestheterraformblock,whichdefinestheproviderandTerraformversionsyouwillusewiththisp......
  • Autel DS900 vs DS808 vs MP808 vs MS906
    Whatisthedifferenceamong2024AutelnewMaxiDASDS900series,DS808andMP808series?Herearesomecomparisontablets.Tablet1:AutelMaxiDASDS900vsDS900BTvsDS900TSModelMaxiDASDS900TSMaxiDASDS900BT MaxiDASDS900ReadCodes√√√E......
  • 跟《经济学人》学英文:2024年08月24日这期 Apple can’t do cars. Meet the Chinese te
    Applecan’tdocars.MeettheChinesetechgiantsthatcanBaidu,HuaweiandXiaomihavebuiltthrivingautobusinesses原文:Ashescreechesaroundcornersatwildlyunsafespeeds,oneofthedesignersoftheJIDURobocar07calmlytalksyourcorrespo......