Day13: DockerFile实作Node前後端(上)

Node.js前後端

前几天讲完了Docker的大致的使用说明,今明两天进入实作环节。我们来利用Docker建立前後端的环境做一个小系统吧。这次实作我们前端使用常见的Vue,後端使用express。明天的教学我们再来加上postgres资料库变成一个完整的专案。

https://ithelp.ithome.com.tw/upload/images/20210917/20119044HKgz5le7uL.png

专案目录如下:
https://ithelp.ithome.com.tw/upload/images/20210915/20119044qWpGvBnINJ.png

  • app : 後端
  • html : 前端
  • config : 一些设定档

Image 设计理念

Docker Image除了像是上一篇我们讲的Dockerfile一层建立外,本身建立逻辑可以用叠积木的方式进行建立,Dockerfile的每一个指令都会堆叠一层Image层,因此Dockerfile的指令层数是越少越好
打一个比方,思考一下node.js的流程与环境需要改动的地方:

  • 几乎不变动 : Node的基本环境,基本上不会去改动他
  • 很少变动 : 透过npm install取得的专案依赖,通常只需要npm install一次,之後便能使用
  • 时常变动 : Code只要改动就需要重新build的Image。

https://ithelp.ithome.com.tw/upload/images/20210915/20119044qZAm1Jvzr9.png

後端

Express後端很单纯启动过程如下:

  1. 找到环境 (node)
  2. 放入 package.json
  3. 载入套件
  4. 启用app (npm start)

在express app根目录层新增一个Dockerfile

# dockerfile

# 使用node为base Image
FROM node:latest

# 设定为production环境
ENV NODE_ENV production

# 移动到工作用的dir
WORKDIR /usr/src/app

# 将package.json 放入该资料夹内 (安装依赖)
COPY package*.json ./

# 安装node_module
RUN npm install

# 把剩下的东西放入work_dir
COPY . .

# expose 和 执行
EXPOSE 3000
CMD ["npm","start"]

如果直接把外层的node_modules资料包COPY进docker内则每次重新build此image都要耗费大量的时间,因此如git有.gitignore,docker也有.dockerignore放在相同的根目录资料夹内让docker不会copy。

#.dockerignore

node_modules
npm-debug.log

接下来就是执行与启用,为了与前後端连结,我们新增一个network叫做itban_network:

  • docker build -t mynode:latest .
  • docker network create itban_network
  • docker run -d -p 4200:3000 --name run_mynode --network itban_network mynode:latest

成功
https://ithelp.ithome.com.tw/upload/images/20210915/20119044ChYIWdDYLW.png

为了区分develop环境与Production环境,我们新增的一个NODE_ENV可以在JS程序内的process.env.NODE_ENV里面找到,配合.env档就能很好的区分出前後端的环境变数了。详细可以参考Github


<<:  DAY15 MongoDB Explain 效能分析工具

>>:  未知的第一天 - 行程整理

DAY8-PHP和MYSQL(二)

前言: 昨天我们成功建立了php网页和mysql资料库的连线,让我们顺利的把一些使用者填写的资料送...

【Day 04】LeetCode:Fizz Buzz ( 用 JavaScript 学演算法 )

我们透过 LeetCode #412 Fizz Buzz 来实际感受解决问题的过程 ( 题目连结 )...

Day13:今天来聊一下Microsoft Defender for Endpoint的配置警报和检测

Microsoft Defender for Endpoint 提供警报和检测的配置选项。 配置包括...

[Android Studio 30天自我挑战] ProgressBar元件介绍

ProgressBar进度条是用来显示目前进度的原件,在系统处理一些耗时的工作时,以进度条来显示告知...