简介
本文介绍如何使用 Docker
搭建 NestJS
和 MongoDB
的开发环境。
完整项目地址: github.com/LeoooY/nest…
要成功的将代码运行起来,并理解每个部分的工作原理,你至少需要对以下的知识点有基本的了解:
JavaScript
&TypeScript
Docker
的基本使用MongoDB
的基本使用
前置条件
- 安装
Docker
和Docker-Compose
- 安装
NodeJS
开始搭建
主要步骤:
- 创建
NestJS
项目 - 容器化
NestJS
项目 - 使用
Docker-Compose
编排容器 - 在
NestJS
项目中连接MongoDB
服务
创建 NestJS
项目
Introduction | NestJS
$ npm i -g @nestjs/cli
$ nest new project-name
使用 nest new
命令创建完成后,cd
到 project-name
项目根目录执行 start:dev
。
打开浏览器访问 http://localhost:3000
,能正常访问就说明NestJS
项目已经创建好了。
容器化 NestJS
项目
在这个步骤,我们需要刚刚创建的NestJS
项目打包成一个 Docker
容器。
- 首先在
NestJS
项目根目录新建一个Dockerfile
文件
$ touch Dockerfile
- 修改
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-Compose
的 docker-compose.yml
配置文件可以将一组相关联的应用容器定义为一个项目,这样我们可以很方便的管理 NestJS
和 MongoDB
的服务。
- 在
NestJS
项目根目录新建一个docker-compose.yml
文件
$ touch docker-compose.yml
- 修改
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
服务。
- 安装
@nestjs/mongoose
$ npm install --save @nestjs/mongoose mongoose
# or yarn
$ yarn add -D @nestjs/mongoose mongoose
- 连接
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
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!