⽤DockerCompose搭建Node.js应⽤(Nest.js)的本地开发环
在本地电脑上开发 应⽤,需要安装⼀个 Node.js,还有就是准备⼀个应⽤需要的数据库管理系统。在本地安装 Node.js 你可以直接下载使⽤安装包,这样你的系统⾥只会包含⼀个版本的 Node.js。如果想同时拥有多个版本的 Node.js,可以使⽤ NVM 这个⼯具来管理安装在电脑上的多个版本的 Node.js,你可以在不同版本之间来回切换。
另外还有⼀种搭建 Node.js 应⽤开发环境的⽅法,就是使⽤ 。下⾯我介绍⼀下在本地电脑上使⽤ Docker 与 Docker Compose 搭建⼀个Node.js 的开发环境。我会⽤ Nest.js 这个应⽤框架作为演⽰。
需求
在本地使⽤ Docker 可以去安装⼀个 Docker 桌⾯版,⽐如 Docker for Windows 或 Docker for Mac。在 Mac 电脑上使⽤ Docker 桌⾯版不会有太⼤问题,但是在 Windows 上运⾏ Docker 桌⾯版会有⼀些需求。
系统必须是 Windows 10 专业版或企业版,普通的 Windows 10 不⾏,⽽且需要在系统⾥启⽤ Hyper-V。
准备
下载安装 Docker 桌⾯版,体积挺⼤,需要下⼀会⼉,下载之前你需要使⽤ Docker Hub 帐号登录⼀下才⾏。
Windows:docs.docker/docker-for-windows/install/
Windows
macOS
macOS:docs.docker/docker-for-mac/install/
Docker 的⼤部分操作需要在命令⾏界⾯下完成,所以你需要准备⼀个命令⾏界⾯,macOS ⽤户可以使⽤系统⾃带的终端(Terminal),Windows ⽤户建议下载安装完整版的 Cmder,然后新建⼀个 Bash as admin 的命令⾏。
配置
Docker 在创建容器的时候,需要⽤到⼀些镜像,也就是如果你的系统上还没有这些镜像的话,Docker 会⾃动到⼀个地⽅去下载这个镜像,保存在你的电脑上,然后基于这个镜像去创建你需要的容器。
把你在阿⾥云容器镜像服务上到的加速地址,配置到你的 Docker 的 Registry Mirrors ⾥⾯。
Nest.js 开发环境
下⾯我们⽤ Docker Compose 搭建⼀个在本地可以运⾏ Nest.js 应⽤的开发环境。
Docker Compose 允许我们在⼀个⽂件⾥描述应⽤需要的服务(容器),为你要开发的项⽬新建⼀个⽬录,然后在根⽬录下创建⼀个l ⽂件。⾥⾯先添加两⾏代码:
version: '3'
services:复制代码
⽤ version 设置了⼀下要使⽤ Docker Compose 版本,⼀会⼉开发环境需要的⼏个服务会在 services 下⾯定义。
.env
在 l ⽂件⾥定义的服务可以使⽤⼀些环境变量,这些环境变量还有对应的值可以
单独放在⼀个叫 .env 的⽂件⾥⾯,这个⽂件就相当于是⼀个配置⽂件。在项⽬根⽬录下⾯创建⼀个空⽩的⽂件叫:.env 。
准备 Nest.js 应⽤的命令⾏⼯具
你打算开发基于 Nest.js 框架的 Node 应⽤,可以先去安装这个框架提供的命令⾏⼯具(@nestjs/cli),它可以让我们使⽤命令去创建全新的应⽤还有应⽤⾥需要的⼀些组件。不过因为我们打算⽤ Docker 的⽅式搭建应⽤的开发环境,所以就不直接在电脑上去安装这个⼯具了,因为这需要你在电脑上安装 Node.js。
在 l ⽂件⾥定义⼀个服务,它的作⽤就是让我们可以使⽤ Nest.js 框架⾥提供的命令⾏⼯具,打开 l ⽂件,在 services 下⾯添加⼀个命令⾏⼯具服务:
version: '3'
services:
cli:
image: nestjs/cli
volumes:
- ./app:/workspace
tty: true复制代码
上⾯定义了⼀个叫 cli 的服务,这个名字你可以随便定义,这个服务⽤的 image,也就是镜像是 nestjs/cli,volumes 设置了⼀下数据卷的功能,意思就是让当前⽬录下的 app 这个⽬录,对应容器⾥的 /workspace 这个位置。把 tty 设置成 true 是为了让这个容器⼀直运⾏。
打开系统的终端(Terminal),Windows ⽤户推荐使⽤ Cmder。进⼊到 l ⽂件所在的⽬录,然后运⾏服务:
cd ~/desktop/ninghao-nestjs
docker-compose up -d cli复制代码
上⾯执⾏了两条命令,第⼀⾏是进⼊到了 l ⽂件所在的⽬录,第⼆⾏命令是在后台运⾏了在 l ⽂件⾥定义的⼀个叫 cli 的服务。验证⼀下服务是否运⾏:
docker-compose ps
Name          Command  State    Ports
-------------------------------------------------
ninghao-nestjs_cli_1  /bin/sh  Up      3000/tcp复制代码
注意服务的 State 是 Up 表⽰正在运⾏,下⾯可以登⼊这个 cli 服务:
docker-compose exec cli /bin/sh复制代码
进来以后你的命令提⽰符会像这样:
/workspace #复制代码
在这个容器⾥我们可以使⽤ Nest.js 应⽤⾥的命令⾏⼯具,执⾏:
nest复制代码
会出现⼀些帮助信息:
Usage: nest [options] [command]
Options:mysql下载什么版本的
-V, --version                                  output the version number
-h, --help                                      output usage information
Commands:
new|n [options] [name]                          Generate Nest application
generate|g [options]  [name] [path]  Generate a Nest element
Available schematics:
复制代码
⽤ Nest 命令⾏⼯具创建应⽤
进⼊到创建的 cli 这个容器⾥⾯以后,可以执⾏ nest 命令,下⾯我们⽤这个命令去创建⼀个 Nest.js 项⽬。执⾏:
nest new app复制代码
会出现类似的东西:
⚡  We will scaffold your app in a few seconds..
CREATE /app/.prettierrc (51 bytes)
CREATE /app/README.md (3370 bytes)
CREATE /app/nest-cli.json (84 bytes)
...复制代码
上⾯就是⽤了 nest new 命令创建了⼀个项⽬,放在 app ⽬录的下⾯,虽然是在 cli 容器⾥创建的这个项⽬,但是我们配置了这个服务的数据卷,所以创建的项⽬⽂件也会在本地电脑上看到。也就是你在本地电脑上这个 l ⽂件所在的⽬录的下⾯,会看到⼀个app ⽬录,这⾥的东西就是创建的 Nest.js 项⽬。
在开发应⽤的时候,如果你要使⽤ nest 命令⾏⼯具⽣成项⽬需要的⽂件,你就可以进⼊到这个 cli 服务容器⾥⾯,然后使⽤ nest 命令去创建你需要的东西。
创建的项⽬的时候可能会提⽰:
Failed to execute command: git init
Git repository has not been initialized复制代码
这是因为创建完项⽬之后,nest 命令会去初始化⼀个代码仓库,但是在这个容器⾥并没有安装 git ,所以执⾏相关命令的时候就会出现问题。你可以在本地⽤ Git 对项⽬做源代码管理。
注意如果你觉得创建项⽬的时候速度慢,可以在进⼊ cli 服务⾥⾯以后,执⾏⼀下:
npm config set registry registry.复制代码
定义应⽤服务
在 l ⽂件⾥,再定义⼀个运⾏ Nest.js 应⽤的服务:
nest:
image: node:${NODE_VERSION}
working_dir: /home/node/app
command: npm config set registry registry.
command: npm run start:dev
volumes:
- ./app:/home/node/app
ports:
- ${APP_PORT}:3000复制代码
上⾯定义了⼀个叫 nest 的服务,因为我们创建的应⽤是基于 Nest.js 框架的,所以这个服务的名字叫 nest,你也可以换成⾃⼰喜欢的名字。
nest 这个服务⽤的 image 是 node,具体的版本⽤了⼀个环境变量,NODE_VERSION,这个环境变量还有对应的值要在 .env ⽂件⾥设置⼀下。
working_dir 进⼊到⼯作⽬录,然后执⾏了两个 command,⼀个是设置了⼀下 npm 的安装源,这样以后安装包的时候会快⼀些,第⼆个command 是运⾏了项⽬的开发服务。
volumes 设置了数据卷,让当前⽬录下的 app 这个⽬录,对应 nest 这个服务容器⾥的 /home/node/ap
p ,我们在这个服务的这个⽬录的下⾯,执⾏了 npm run start:dev,这也就会运⾏这个 Nest.js 项⽬的开发服务。
ports 设置了公开的端⼝,就是设置⼀个主机(本地电脑)上的端⼝,让这个端⼝对应这个容器⾥的某个端⼝。运⾏了 Nest 应⽤的开发服务以后,会使⽤ 3000 这个端⼝提供服务。${APP_PORT} 这⾥⽤了⼀个叫 APP_PORT 的环境变量,具体的值要在 .env ⽂件⾥设置⼀下:
NODE_VERSION=11.13
APP_PORT=3000复制代码
注意在 .env ⽂件⾥,我们让 APP_PORT 这个环境变量的值等于 3000,也就是公开的端⼝应该就是 3000:3000,也就是本地电脑上的3000 端⼝对应的是这个服务⾥的 3000 端⼝。
有了这个新的 nest 服务,要再去运⾏⼀下:
docker-compose up -d nest复制代码
以后你需要⽤ npm install 给项⽬安装⼀些 Package 的时候,可以进⼊到这个 nest 服务⾥⾯,使⽤ npm。进⼊这个服务可以执⾏:docker-compose exec nest bash复制代码
定义数据服务
开发 Nest.js 应⽤⽀持使⽤多种不同类型的数据库,需要哪种数据库系统,你就去创建⼀个对应的服务就⾏了。⽐如我要在应⽤⾥使⽤MySQL 这种数据库,所以可以在 l ⾥⾯,再去定义⼀个 mysql 服务:
mysql:
image: mysql:${MYSQL_VERSION}
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
restart: always
ports:
- ${MYSQL_PORT}:3306
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}复制代码
服务⾥⾯⽤到了⼀些环境变量,打开 .env ,在⽂件⾥去定义这些环境变量还有对应的值:
MYSQL_VERSION=5.7
MYSQL_PORT=3306
MYSQL_DATABASE=nest
MYSQL_USER=nest
MYSQL_ROOT_PASSWORD=root
MYSQL_PASSWORD=password复制代码
主要就是设置⼀下要使⽤的 MySQL 系统的版本,在本地主机上访问这个数据服务⽤的端⼝是什么,
还有创建的数据库的名字、⽤户还有密码是什么。你可以修改 .env ⽂件⾥的这些环境变量的值,来改变数据库的配置。
上⾯会创建⼀个 5.7 版本的 MySQL,在本地主机上使⽤这个数据服务⽤的端⼝是 3306,数据库系统⾥会创建⼀个叫 nest 的数据库,操作这个数据库可以使⽤ nest ⽤户,对应的密码是 password,另外设置了⼀下数据库系统的 root ⽤户的密码为 root。
定义好这个数据服务,需要去运⾏⼀下:
docker-compose up -d mysql复制代码
查看⽇志
查看容器⾥的输出的⽇志,可以执⾏:
docker-compose logs --follow复制代码
附录
version: '3'
services:
cli:
image: nestjs/cli
volumes:
- ./:/workspace
tty: true
nest:
image: node:${NODE_VERSION}
working_dir: /home/node/app
command: npm config set registry registry.
command: npm run start:dev
volumes:
- ./app:/home/node/app
ports:
- ${APP_PORT}:3000
mysql:
image: mysql:${MYSQL_VERSION}
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci    restart: always
ports:
- ${MYSQL_PORT}:3306
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
复制代码
.env:
NODE_VERSION=11.13
APP_PORT=3000
MYSQL_VERSION=5.7
MYSQL_PORT=3306
MYSQL_DATABASE=nest
MYSQL_USER=nest
MYSQL_ROOT_PASSWORD=root
MYSQL_PASSWORD=password复制代码

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。