用 Docker Compose 搭建 Node.js 應用(Nest.js)的本地開發環境

在本地電腦上開發 Node.js 應用,須要安裝一個 Node.js,還有就是準備一個應用須要的數據庫管理系統。在本地安裝 Node.js 你能夠直接下載使用安裝包,這樣你的系統裏只會包含一個版本的 Node.js。若是想同時擁有多個版本的 Node.js,可使用 NVM 這個工具來管理安裝在電腦上的多個版本的 Node.js,你能夠在不一樣版本之間來回切換。node

另外還有一種搭建 Node.js 應用開發環境的方法,就是使用 Docker。下面我介紹一下在本地電腦上使用 Docker 與 Docker Compose 搭建一個 Node.js 的開發環境。我會用 Nest.js 這個應用框架做爲演示。mysql

需求

在本地使用 Docker 能夠去安裝一個 Docker 桌面版,好比 Docker for Windows 或 Docker for Mac。在 Mac 電腦上使用 Docker 桌面版不會有太大問題,可是在 Windows 上運行 Docker 桌面版會有一些需求。git

系統必須是 Windows 10 專業版或企業版,普通的 Windows 10 不行,並且須要在系統裏啓用 Hyper-V。sql

準備

下載安裝 Docker 桌面版,體積挺大,須要下一下子,下載以前你須要使用 Docker Hub 賬號登陸一下才行。docker

  • Windows:https://docs.docker.com/docker-for-windows/install/
  • macOS:https://docs.docker.com/docker-for-mac/install/

Docker 的大部分操做須要在命令行界面下完成,因此你須要準備一個命令行界面,macOS 用戶可使用系統自帶的終端(Terminal),Windows 用戶建議下載安裝完整版的 Cmder,而後新建一個 Bash as admin 的命令行。數據庫

配置

Docker 在建立容器的時候,須要用到一些鏡像,也就是若是你的系統上尚未這些鏡像的話,Docker 會自動到一個地方去下載這個鏡像,保存在你的電腦上,而後基於這個鏡像去建立你須要的容器。npm

下載這些鏡像的地方默認在國外,因此咱們在國內有時會比較慢,解決的方法是配置一下 Docker 讓它使用國內的鏡像加速地址。好比阿里雲暫時就提供了這個服務,你可使用本身的阿里雲賬號登陸到阿里雲的容器鏡像服務,在裏面你會找到一個鏡像加速地址,看起來像這樣:https://wgaccbzr.mirror.aliyuncs.comjson

把你在阿里雲容器鏡像服務上找到的加速地址,配置到你的 Docker 的 Registry Mirrors 裏面。windows

Nest.js 開發環境

下面咱們用 Docker Compose 搭建一個在本地能夠運行 Nest.js 應用的開發環境。瀏覽器

docker-compose.yml

Docker Compose 容許咱們在一個文件裏描述應用須要的服務(容器),爲你要開發的項目新建一個目錄,而後在根目錄下建立一個 docker-compose.yml 文件。裏面先添加兩行代碼:

version: '3'

services:複製代碼

version 設置了一下要使用 Docker Compose 版本,一下子開發環境須要的幾個服務會在 services 下面定義。

.env

在 docker-compose.yml 文件裏定義的服務可使用一些環境變量,這些環境變量還有對應的值能夠單獨放在一個叫 .env 的文件裏面,這個文件就至關因而一個配置文件。在項目根目錄下面建立一個空白的文件叫:.env

準備 Nest.js 應用的命令行工具

你打算開發基於 Nest.js 框架的 Node 應用,能夠先去安裝這個框架提供的命令行工具(@nestjs/cli),它可讓咱們使用命令去建立全新的應用還有應用裏須要的一些組件。不過由於咱們打算用 Docker 的方式搭建應用的開發環境,因此就不直接在電腦上去安裝這個工具了,由於這須要你在電腦上安裝 Node.js。

docker-compose.yml 文件裏定義一個服務,它的做用就是讓咱們可使用 Nest.js 框架裏提供的命令行工具,打開 docker-compose.yml 文件,在 services 下面添加一個命令行工具服務:

version: '3'

services:
  cli:
    image: nestjs/cli
    volumes:
      - ./app:/workspace
    tty: true複製代碼

上面定義了一個叫 cli 的服務,這個名字你能夠隨便定義,這個服務用的 image,也就是鏡像是 nestjs/clivolumes 設置了一下數據卷的功能,意思就是讓當前目錄下的 app 這個目錄,對應容器裏的 /workspace 這個位置。把 tty 設置成 true 是爲了讓這個容器一直運行。

打開系統的終端(Terminal),Windows 用戶推薦使用 Cmder。進入到 docker-compose.yml 文件所在的目錄,而後運行服務:

cd ~/desktop/ninghao-nestjs
docker-compose up -d cli複製代碼

上面執行了兩條命令,第一行是進入到了 docker-compose.yml 文件所在的目錄,第二行命令是在後臺運行了在 docker-compose.yml 文件裏定義的一個叫 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:
  -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 容器裏建立的這個項目,可是咱們配置了這個服務的數據卷,因此建立的項目文件也會在本地電腦上看到。也就是你在本地電腦上這個 docker-compose.yml 文件所在的目錄的下面,會看到一個 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 https://registry.npm.taobao.org複製代碼

定義應用服務

docker-compose.yml 文件裏,再定義一個運行 Nest.js 應用的服務:

nest:
    image: node:${NODE_VERSION}
    working_dir: /home/node/app
    command: npm config set registry https://registry.npm.taobao.org
    command: npm run start:dev
    volumes:
      - ./app:/home/node/app
    ports:
      - ${APP_PORT}:3000複製代碼

上面定義了一個叫 nest 的服務,由於咱們建立的應用是基於 Nest.js 框架的,因此這個服務的名字叫 nest,你也能夠換成本身喜歡的名字。

nest 這個服務用的 imagenode,具體的版本用了一個環境變量,NODE_VERSION,這個環境變量還有對應的值要在 .env 文件裏設置一下。

working_dir 進入到工做目錄,而後執行了兩個 command,一個是設置了一下 npm 的安裝源,這樣之後安裝包的時候會快一些,第二個 command 是運行了項目的開發服務。

volumes 設置了數據卷,讓當前目錄下的 app 這個目錄,對應 nest 這個服務容器裏的 /home/node/app ,咱們在這個服務的這個目錄的下面,執行了 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複製代碼

若是一切正常,打開瀏覽器,訪問 http://localhost:3000,你應該會看到一個 「Hello World」。

之後你須要用 npm install 給項目安裝一些 Package 的時候,能夠進入到這個 nest 服務裏面,使用 npm。進入這個服務能夠執行:

docker-compose exec nest bash複製代碼

定義數據服務

開發 Nest.js 應用支持使用多種不一樣類型的數據庫,須要哪一種數據庫系統,你就去建立一個對應的服務就好了。好比我要在應用裏使用 MySQL 這種數據庫,因此能夠在 docker-compose.yml 裏面,再去定義一個 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複製代碼

附錄

docker-compose.yml:

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 https://registry.npm.taobao.org
    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複製代碼
相關文章
相關標籤/搜索