自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用Docker Compose改善Node.js的開發(fā)

開發(fā) 前端
本文中,我們以Express.js為一個(gè)示例展開,需要實(shí)現(xiàn)了解一丁點(diǎn)Node.js和npm的基礎(chǔ)知識(shí)。還要了解Express.js框架的基礎(chǔ)知識(shí)。

在過去的幾年中,Docker和Node.js都變得非常流行。對(duì)于開發(fā)人員來說利用這些新技術(shù)來改善自己的開發(fā)體驗(yàn)很有必要,而且在此過程中還可以學(xué)習(xí)新技術(shù)。遵循"Coding到老,學(xué)習(xí)到老,折騰到老"的宗旨,本文我們將介紹將如何結(jié)合Node.js與Docker來改善開發(fā)人員體驗(yàn),包括使用docker build和利用Docker Compose來實(shí)現(xiàn)無縫的本地前端開發(fā)環(huán)境。

[[375856]]

概述

本文中,我們以Express.js為一個(gè)示例展開,需要實(shí)現(xiàn)了解一丁點(diǎn)Node.js和npm的基礎(chǔ)知識(shí)。還要了解Express.js框架的基礎(chǔ)知識(shí)。

對(duì)Docker也要有一定的概念和要會(huì)基礎(chǔ)操作(不會(huì)也沒關(guān)系,很容易)。

使用Docker Compose改善Node.js的開發(fā)

最后本文全程使用Linux(Mac) shell終端命令行。

創(chuàng)建Express.js項(xiàng)目

為了要生成示范應(yīng)用程序,需要使用Express應(yīng)用程序生成器。需要運(yùn)行以下npx命令行:

  1. npx express-generator --view=pug --git <app-name> 

Express生成器將生成Express應(yīng)用。--view=pub選項(xiàng)表示使用pug視圖引擎。--git表示用來給項(xiàng)目添加一個(gè)git .gitignore文件。

生成效果如下:

使用Docker Compose改善Node.js的開發(fā)

測試Express應(yīng)用

要測試該應(yīng)用程序,需要運(yùn)行npm install安裝所有必需的npm模塊。然后,運(yùn)行以下命令以啟動(dòng)應(yīng)用程序:

  1. DEBUG=nodejs-docker-express:* npm start 

如果沒有異常,應(yīng)該會(huì)到一條類似的消息。

  1. nodejs-docker-express:server Listening on port 3000 

上面的命令非常簡單:它運(yùn)行一個(gè)環(huán)境變量DEBUG=nodejs-docker-express,用來表示服務(wù)器進(jìn)行詳細(xì)的調(diào)試。

對(duì)Windows系統(tǒng),使用的參數(shù)要修改為:

  1. set DEBUG=nodejs-docker-express:* & npm start 

現(xiàn)在打開瀏覽器,在地址欄并輸入localhost:3000并訪問:

使用Docker Compose改善Node.js的開發(fā)

這樣示例的Express.js應(yīng)用就已經(jīng)在運(yùn)行OK了。是不是非常簡單?有此基本的"Hello,World!"為基礎(chǔ),我們進(jìn)一步深入。

Docker多階段構(gòu)建

容器化應(yīng)用程序有很多好處:首先,無論運(yùn)行平臺(tái)是什么,其行為都相同。借助Docker容器,應(yīng)用程序可以輕松部署到各個(gè)公有容器云(比如AWS Fargate,Google Cloud Run),自建的K8S集群中,甚至本地docker上。

容器化,基礎(chǔ)是Dockerfile。Dockerfile是構(gòu)建Docker鏡像的基礎(chǔ)。用Dockerfile編譯生成的鏡像運(yùn)行時(shí),就稱之為容器。

使用Docker Compose改善Node.js的開發(fā)

如圖示,整個(gè)過程非常簡單:從Dockerfile構(gòu)建Docker鏡像。運(yùn)行鏡像,得到運(yùn)行時(shí)容器。

Dockerfile

Dockerfile有一些類似命令行的語句:

  1. FROM node:14-alpine as base 
  2. WORKDIR /src 
  3. COPY package*.json / 
  4. EXPOSE 3000 
  5. FROM base as production 
  6. ENV NODE_ENV=production 
  7. RUN npm ci 
  8. COPY . / 
  9. CMD ["node", "bin/www"] 
  10.  
  11. FROM base as dev 
  12. ENV NODE_ENV=development 
  13. RUN npm install -g nodemon && npm install 
  14. COPY . / 
  15. CMD ["nodemon", "bin/www"] 

通過Docker鏡像的分層繼承,創(chuàng)建了一個(gè)精簡的production鏡像和一個(gè)功能更豐富,以開發(fā)為重點(diǎn)的dev鏡像。

在Dockerfile中,使用了多階段構(gòu)建,整個(gè)過程分為三個(gè)階段:base,production和dev。production和dev依賴于base,base為node:14-alpine的基礎(chǔ)鏡像,該基礎(chǔ)鏡像需要從DockerHub獲取,這是一個(gè)官方Alpine基礎(chǔ)OS的Node.js官方鏡像,主鏡像為345MB,Node.js鏡像大概不到40M。

  1. WORKDIR /src 
  2. COPY package*.json / 
  3. EXPOSE 3000 

WORKDIR語句設(shè)置了Docker運(yùn)行的工作目錄,其后的命令都在該工作目錄運(yùn)行。COPY語句,復(fù)制package*.json(package.json和package-lock.json)容器中。

EXPOSE語句,設(shè)置Node.js Express Web服務(wù)器的監(jiān)聽端口。上述步驟對(duì)于開發(fā)和生產(chǎn)階段都是通用的。

現(xiàn)在我們來看看生產(chǎn)目標(biāo)階段是如何構(gòu)建的。

production

在生產(chǎn)階段,繼續(xù)從基礎(chǔ)階段開始的工作,F(xiàn)ROM語句指示Docker從base開始。ENV語句設(shè)置Docker將環(huán)境變量NODE_ENV為production。

  1. FROM base as production 
  2. ENV NODE_ENV=production 
  3. RUN npm ci 
  4. COPY . / 
  5. CMD ["node", "bin/www"] 

變量ENV設(shè)置為production可以使性能提高三倍,并且提供一些其他優(yōu)化,比如緩存視圖。npm install命令只會(huì)安裝主要依賴項(xiàng),忽略開發(fā)依賴項(xiàng)。這些設(shè)置非常適合生產(chǎn)環(huán)境。

接著使用RUN語句運(yùn)行npm ci而非npm install。npm ci適用于持續(xù)集成和部署。和npm install相比,會(huì)繞過某些面向用戶的功能。當(dāng)然,npm ci需要一個(gè)package-lock.json文件才能工作。

之后,還是使用COPY語句將代碼復(fù)制到工作目錄。

最后使用CMD語句,運(yùn)行Node應(yīng)用服務(wù)器和/srcbin/www

dev

我們利用了多階段構(gòu)建,并在開發(fā)階段添加開發(fā)所需的組件:

  1. FROM base as dev 
  2. ENV NODE_ENV=development 
  3. RUN npm install -g nodemon && npm install 
  4. COPY . / 
  5. CMD ["nodemon", "bin/www"] 

大體上和生產(chǎn)極端類似,差異為NODE_ENV環(huán)境變量設(shè)置為development。

接著,用RUN語句安裝nodemon。每當(dāng)文件更改時(shí),nodemon都會(huì)重新啟動(dòng)服務(wù)器,從而開發(fā)體驗(yàn)更加流暢。同時(shí)執(zhí)行npm install,該命令會(huì)遞歸安裝dev依賴項(xiàng)。例如,如果要使用Jest測試應(yīng)用程序,那將是開發(fā)依賴項(xiàng)之一。

請(qǐng)注意,這兩個(gè)命令通過&&放在一起,創(chuàng)建更少的Docker層,于構(gòu)建緩存非常有用。這是撰寫Dockerfile時(shí)候常用的一個(gè)技巧。

和生產(chǎn)階段相同,將代碼復(fù)制到容器。但是,用nodemon取代了Node服務(wù)器,這樣在每次文件/src更改時(shí)會(huì)重新啟動(dòng)它。

.dockerignore

和git的.gitignore一樣,docker也使用.dockerignore來忽略不想放入Docker鏡像的文件。通過忽略無關(guān)的文件更改,它有助于使Docker鏡像保持身材,而且能使構(gòu)建緩存更高效。本示例中.dockerignore

  1. .git 
  2. node_modules 

非常簡單,告訴Docker不COPY.git文件夾和node_modules從主機(jī)復(fù)制到Docker容器。

使用Docker Compose

到目前為止,我們創(chuàng)建一個(gè)使用運(yùn)行Node.js Express應(yīng)用程序Docker所需的大部分功能。為了更便捷,我們還建議用Docker Compose,這樣可以更輕松地使用單個(gè)或多個(gè)容器運(yùn)行應(yīng)用程序。這樣也無需要記住很長的命令來構(gòu)建或運(yùn)行容器。只需通過:

  1. docker-compose build 
  2. docker-compose up 

但是docker-compose使用yml的配置文件和dockerfile略有不同:

使用Docker Compose改善Node.js的開發(fā)

上述,我們指定Docker Compose的版本,在本例中為3.8,對(duì)應(yīng)Docker引擎19.0.3支持的最新版本。這樣可以支持多階段Docker構(gòu)建。

接著,指定正在使用的服務(wù)。在本教程中,只有一個(gè)名為web的服務(wù),具有context為當(dāng)前目錄的構(gòu)建以及一個(gè)重要的構(gòu)建參數(shù)target設(shè)置為dev。這告訴Docker在dev階段構(gòu)建Docker映像。

之后,通過volumes制定 Docker卷。它指示Docker從Docker容器上的./和主機(jī)本地/src目錄復(fù)制和同步更改。當(dāng)我們在主機(jī)中更改文件時(shí),這將很有用,并且文件也將立即反映到容器中。

command語句運(yùn)行npm run start:dev,start:dev執(zhí)行內(nèi)容定義在package.json,內(nèi)容為:

  1. "start:dev": "nodemon ./bin/www" 

表示使用nodemon啟動(dòng)Web服務(wù)器。在開發(fā)環(huán)境中,可以在每次保存文件時(shí)重新啟動(dòng)服務(wù)器。

接下來,用ports語句設(shè)置docker端口映射主機(jī)的3000端口與容器3000端口。在構(gòu)建容器時(shí),公開了端口3000, Web服務(wù)器就會(huì)在3000上運(yùn)行。

最后,設(shè)置了兩個(gè)環(huán)境變量。首先,將其NODE_ENV設(shè)置為development,因?yàn)檫@樣可以看到詳細(xì)的Debug信息,也沒有任何視圖緩存。然后,將debug設(shè)置為*,讓W(xué)eb服務(wù)器打印出所有內(nèi)容的詳細(xì)調(diào)試消息。

測試應(yīng)用程序

前面,設(shè)置了弄好了基礎(chǔ)構(gòu)建配置文件,接著構(gòu)建Docker鏡像。使用BuildKit優(yōu)化Docker構(gòu)建。啟用BuildKit可以更快地構(gòu)建Docker鏡像,運(yùn)行以下命令:

  1. COMPOSE_DOCKER_CLI_BUILD=1 DOCKER_BUILDKIT=1 docker-compose build 

該命令告訴Compose在BuildKit上構(gòu)建Docker鏡像。它應(yīng)該在一段時(shí)間內(nèi)運(yùn)行并構(gòu)建Docker鏡像,如下所示:

使用Docker Compose改善Node.js的開發(fā)

Docker鏡像大約在14秒內(nèi)構(gòu)建完成,使用BuildKit可以更快。運(yùn)行該鏡像:

docker-compose up

使用Docker Compose改善Node.js的開發(fā)

然后瀏覽器訪問localhost:3000:

使用Docker Compose改善Node.js的開發(fā)

這樣我們,自配置的應(yīng)用程序在Docker上已經(jīng)完美運(yùn)行。我們來改改源文件,看看效果。

我們修改下源碼將" Welcome to Express"更改為" Welcome to Express with Docker"來測試。在源文件目錄/src下,找到routes/index.jsline文件,修改語句為:

  1. res.render('index', { title: 'Express with Docker' }); 

保存文件,然后可以看到Web服務(wù)器已經(jīng)重新啟動(dòng),表示Docker卷和nodemon可以都可以正常工作。

使用Docker Compose改善Node.js的開發(fā)

F5刷新瀏覽器,內(nèi)容已經(jīng)修改:

使用Docker Compose改善Node.js的開發(fā)

總結(jié)

本文中我們利用Docker和Docker Compose構(gòu)建了一個(gè)簡單的Nodejs的開發(fā)和運(yùn)行環(huán)境。Node.js和docker的配合很好。通過使用docker-compose,開發(fā)體驗(yàn)更加流暢。當(dāng)然這這是一個(gè)很簡單的開始,對(duì)于更復(fù)雜的應(yīng)用(比如需要訪問數(shù)據(jù)庫)才是Docker Compose的用武之地,他可以同時(shí)啟動(dòng)和管理多個(gè)容器,比如給開發(fā)環(huán)境增加Mongo或MySQL添加為應(yīng)用程序的數(shù)據(jù)源,只需很輕松地增加一個(gè)docker-compose配置的服務(wù)語句就可以搞定整個(gè)環(huán)境。

 

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2022-08-28 16:30:34

Node.jsDocker指令

2015-03-10 10:59:18

Node.js開發(fā)指南基礎(chǔ)介紹

2012-09-29 11:13:15

Node.JS前端開發(fā)Node.js打包

2011-12-16 10:08:36

Node.js

2018-08-30 16:08:37

Node.js腳手架工具

2018-06-11 14:39:57

前端腳手架工具node.js

2011-10-24 16:16:02

Node.js

2024-07-12 14:54:48

2023-01-10 14:11:26

2013-11-01 09:34:56

Node.js技術(shù)

2020-09-04 15:06:04

Docker容器化Node.js

2022-01-07 08:00:00

Node.js開發(fā)Web

2011-11-10 11:08:34

Node.js

2019-05-05 11:47:09

TypeScript開發(fā)Node.js

2020-02-25 12:27:59

Node.jsWeb開發(fā)前端

2021-12-28 20:04:23

Node.js開發(fā)JavaScript

2020-05-29 15:33:28

Node.js框架JavaScript

2012-02-03 09:25:39

Node.js

2021-12-25 22:29:57

Node.js 微任務(wù)處理事件循環(huán)

2021-03-03 06:39:05

Nodejs前端開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)