最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 使用 Docker 搭建 NestJS 和 Mongo 的开发环境

    正文概述 掘金(LeoooY)   2021-08-04   991

    简介

    本文介绍如何使用 Docker 搭建 NestJSMongoDB 的开发环境。

    完整项目地址: github.com/LeoooY/nest…

    要成功的将代码运行起来,并理解每个部分的工作原理,你至少需要对以下的知识点有基本的了解:

    • JavaScript & TypeScript
    • Docker 的基本使用
    • MongoDB 的基本使用

    前置条件

    • 安装 DockerDocker-Compose
    • 安装 NodeJS

    开始搭建

    主要步骤:

    1. 创建 NestJS 项目
    2. 容器化 NestJS 项目
    3. 使用 Docker-Compose 编排容器
    4. NestJS 项目中连接 MongoDB 服务

    创建 NestJS 项目

    Introduction | NestJS

    $ npm i -g @nestjs/cli
    $ nest new project-name
    

    使用 nest new 命令创建完成后,cdproject-name 项目根目录执行 start:dev

    打开浏览器访问 http://localhost:3000,能正常访问就说明NestJS 项目已经创建好了。

    容器化 NestJS 项目

    在这个步骤,我们需要刚刚创建的NestJS 项目打包成一个 Docker 容器。

    1. 首先在 NestJS 项目根目录新建一个 Dockerfile 文件
    $ touch Dockerfile
    
    1. 修改 Dockerfile 文件内容
    
    # Docker多阶段构建
    
    ### DEV环境 ###
    FROM node:14.17.3 AS development
    
    # 定位到容器工作目录
    WORKDIR /usr/src/app
    # 拷贝package.json
    COPY package*.json ./
    
    RUN npm install glob rimraf
    RUN npm install --only=development
    COPY . .
    RUN npm run build
    
    
    ### PROD环境 ###
    FROM node:14.17.3 as production
    
    ARG NODE_ENV=production
    ENV NODE_ENV=${NODE_ENV}
    
    WORKDIR /usr/src/app
    
    COPY package*.json ./
    
    RUN \
      npm config set registry https://registry.npm.taobao.org \
      && npm install --only=production
    
    COPY . .
    
    COPY --from=development /usr/src/app/dist ./dist
    
    CMD ["node", "dist/main"]
    

    这样一个 NestJS 项目的 Docker 镜像就定制好了。

    使用 Docker-Compose 编排容器

    Docker-Composedocker-compose.yml 配置文件可以将一组相关联的应用容器定义为一个项目,这样我们可以很方便的管理 NestJSMongoDB 的服务。

    1. NestJS 项目根目录新建一个 docker-compose.yml 文件
    $ touch docker-compose.yml
    
    1. 修改 docker-compose.yml 文件内容
    version: '3.9'
    services:
      dev:
        container_name: server-dev
        image: server-dev:1.0.0
        build:
          context: .
          target: development
          dockerfile: ./Dockerfile
        command: npm run start:debug
        ports:
          - 3000:3000
          - 9229:9229
        networks:
          - server-network
        volumes:
          - .:/usr/src/app
          - /usr/src/app/node_modules
        restart: unless-stopped
        environment:
          MONGO_URL: mongodb
      prod:
        container_name: server-prod
        image: server-prod:1.0.0
        build:
          context: .
          target: production
          dockerfile: ./Dockerfile
        command: npm run start:prod
        ports:
          - 3000:3000
          - 9229:9229
        networks:
          - server-network
        volumes:
          - .:/usr/src/app
          - /usr/src/app/node_modules
        restart: unless-stopped
      mongodb:
        image: mongo:5.0.0
        container_name: server-mongodb
        environment:
          - MONGO_INITDB_ROOT_USERNAME=root
          - MONGO_INITDB_ROOT_PASSWORD=pass12345
        volumes:
          - mongodb-data:/data/db
        networks:
          - server-network
        ports:
          - 27017:27017
        healthcheck:
          test: echo 'db.runCommand("ping").ok' | mongo localhost:27017/test --quiet
          interval: 30s
          timeout: 10s
          retries: 3
        restart: unless-stopped
      mongo-express:
        image: mongo-express
        container_name: server-mongo-express
        environment:
          - ME_CONFIG_MONGODB_SERVER=mongodb
          - ME_CONFIG_MONGODB_ENABLE_ADMIN=true
          - ME_CONFIG_MONGODB_ADMINUSERNAME=root
          - ME_CONFIG_MONGODB_ADMINPASSWORD=pass12345
          - ME_CONFIG_BASICAUTH_USERNAME=admin
          - ME_CONFIG_BASICAUTH_PASSWORD=admin123
        volumes:
          - mongodb-data
        depends_on:
          - mongodb
        networks:
          - server-network
        ports:
          - 8081:8081
        healthcheck:
          test: wget --quiet --tries=3 --spider http://admin:admin123@localhost:8081 || exit 1
          interval: 30s
          timeout: 10s
          retries: 3
        restart: unless-stopped
    volumes:
      mongodb-data:
        name: mongodb-data
    networks:
      server-network:
    

    到这一步,我们已经完成了容器化的所有步骤,剩下的就是在 NestJS 去连接 MongoDB 服务。

    NestJS 项目中连接 MongoDB 服务

    我们使用 NestJS 推荐的 @nestjs/mongoose 工具来连接 MongoDB 服务。

    1. 安装 @nestjs/mongoose
    $ npm install --save @nestjs/mongoose mongoose 
    # or yarn
    $ yarn add -D @nestjs/mongoose mongoose 
    
    1. 连接 MongoDB 服务

    app.module.ts

    import { Module } from '@nestjs/common';
    import { AppController } from './app.controller';
    import { AppService } from './app.service';
    import { MongooseModule } from '@nestjs/mongoose';
    
    const url = process.env.MONGO_URL || 'localhost';
    
    @Module({
      controllers: [AppController],
      providers: [AppService],
      imports: [
        MongooseModule.forRoot(
          `mongodb://${url}:27017?serverSelectionTimeoutMS=2000&authSource=admin`,
        ),
      ],
    })
    export class AppModule {}
    

    启动项目

    现在,我们已经完成了所有的配置工作,可以把项目给跑起来了。

    启动 NestJS 服务、Mongo 服务和 Mongo-Express 服务。

    $ docker-compose up -d dev mongodb mongo-express
    
    $ docker-compose up -d -V dev
    

    查看各个容器的状态

    $ docker ps 
    

    查看容器的日志

    $ docker logs server-dev 
    $ docker logs server-dev -f # -f 用于参数持续输出logs
    

    进入容器 shell

    $ docker exec -it server-mongodb bash # 进入mongo容器
    

    参考资料

    • Setting up a NestJS project with Docker for Back-End development
    • Containerized development with NestJS and Docker
    • How To Run MongoDB as a Docker Container
    • Containerize Nest.js+MongoDB application in 5 minutes
    • Accessing a docker container from another container
    • From inside of a Docker container, how do I connect to the localhost of the machine?
    • Docker从入门到实践
    • Eggjs Dockerfile
    • @nestjs/mongoose
    • Docker-compose: node_modules not present in a volume after npm install succeeds
    • Top 4 Tactics To Keep Node.js Rockin’ in Docker

    起源地下载网 » 使用 Docker 搭建 NestJS 和 Mongo 的开发环境

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元