Code Monkey home page Code Monkey logo

nest-mongo-docker-env's Introduction

nest-mongo-docker-env

简介

本仓库使用 Docker 搭建了一个 NestJS + MongoDB 的开发环境。

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

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

前置条件

开始搭建

主要步骤:

  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 镜像就定制好了。

由于还有 MongoDB 相关的容器服务,我们不直接使用 Docker 命令来构建、运行,而是使用 Docker-Compose 编排容器。

使用 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 {}

需要注意的是我们使用的 mongodb 连接地址 process.env.MONGO_URLdocker-compose.yml 中定义的 mongodb 服务的地址,参考 Accessing a docker container from another container。

启动项目

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

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

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

注意:当你使用 npm 安装了新的 package 时,需要使用 -V 参数来重新创建容器的 node_modules 匿名数据卷。

$ 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容器

参考资料

nest-mongo-docker-env's People

Contributors

leoooy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

myfire2014

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.