5. 部署 Node.js 应用
掌握了前端项目的本地部署后,Node 应用如何部署?
5.1 准备后端服务源码
node.js 安装就略过了。
直接用命令行开干:
mkdir my-express-app-docker-1 cd $_ npm init -y npm i express touch server.js ls nano server.js
server.js 内容如下:
'use strict'; const express = require('express'); // Constants const PORT = 8080; const HOST = '0.0.0.0'; // App const app = express(); app.get('/', (req, res) => { res.send('Hello World'); }); app.listen(PORT, HOST, () => { console.log(`Running on http://${HOST}:${PORT}`); });
在 package.json 文件中添加启动脚本:
运行 npm run start
后,使用 curl 查看回应,一切正常:
5.2 添加 .dockerignore 和 Dockfile
express 包用到了 node,本地的 node_modules 不需要拷贝进 docker,所以要用到一个很像 .gitignore 的文件 —— .dockerignore,用来忽略相应文件,.dockerignore 文件内容如下:
node_modules npm-debug.log
在项目根目录下新建文件 Dockerfile,内容如下:
# 使用更轻量的 node18 FROM node:18-alpine # 创建工作目录 /app WORKDIR /app # 把安装依赖所需的 package.json AND package-lock.json 复制到 /app COPY package*.json ./ # 安装依赖 RUN npm install # 如果是生产环境使用 ci # RUN npm ci --omit=dev # 打包源码到 /app COPY . . # 暴露端口 8080 EXPOSE 8080 # 启动容器后,执行 node server.js CMD ["node", "server.js"]
5.3 构建镜像 + 启动容器
这一步和前端部署章节是一样的。
构建镜像:
docker build -t express-app .
构建了一个叫做 express-app 的 image,如果不加冒号和 tag 号,那么构建出的镜像默认就是 latest 版本。
启动容器:
docker run -d --name my-express-app -p 3002:8080 express-app
用 express-app 启动一个叫做 my-express-app 的 express 应用容器。
通过 curl
指令来查看网页连接情况:
curl -i localhost:3002
连接正常!
如果想停掉这个运行的服务就执行 docker stop my-express-app
,如果想再次启动就执行 docker start my-express-app
Node 应用的部署也搞定了!
至于自动化部署,按照前端自动化部署脚本照猫画虎即可,这里不多赘述了~
5.4 进入容器
如果想要进入容器看看,那么执行:
# docker exec -it <container> <command> # 因为使用 apline 版本的镜像,所以不能用 bash,这里用 sh 或者 ash 代替 docker exec -it my-express-app ash
输入 whoami
可以看到当前用户是 root:
如果没有在 Dockerfile 中设置权限,那么默认都会使用 root,这是一个潜在的问题,一般生产环境不会直接使用 root 去部署服务,关于这一点先挖个坑。
输入 exit
回车即可退出容器操作。
6. 镜像推送
现在我们前后端的镜像都有了(vite-web 和 express-app),推送到仓库去,然后测试工程师就可以从测试环境、生产环境拉取代码进行测试了。一般来说,公司都会搭建自己的 docker 镜像仓库,这里以 docker hub 为例(注册略):
6.1 docker 登录
第一步、登录 docker hub:
docker login
6.2 tag 标签设置
第二步、给镜像打上标签:
# docker tag <image> <username>/<image> docker tag vite-web:v1 ericknight/vite-web docker tag express-app ericknight/express-app
注意:username
必须是你的用户名,不能乱填。
6.3 推送到镜像仓库
最后推动到仓库:
docker push ericknight/vite-web:latest docker push ericknight/express-app:latest
之后,在 docker hub 上就能看到刚刚推送的镜像了:
7. 总结
到这里,基本上就可以掌握 docker 的基础使用以及如何在本地部署项目了,基本流程掌握好就可以:
- Dockerfile
- docker build 或 docker pull
- docker run
- docker push
当然还有其他的 docker 指令,大家可以自己琢磨琢磨。另外,其实部署的内容还有很多很多。比如如何通个网将前后端、数据库联合起来、如何做数据持久化、如何做 CI / CD、如何部署到云服务器,甚至是放弃 docker,使用 serverless 部署,暂且挖个坑……