docker部署node服务
记录 docker 部署网站后端 node 服务的过程
# Dockerfile
首先在项目根目录新增一个 Dockerfile 文件
# FROM 表示设置要制作的镜像基于哪个镜像,FROM指令必须是整个Dockerfile的第一个指令,如果指定的镜像不存在默认会自动从Docker Hub上下载。
# 指定我们的基础镜像是node,latest表示版本是最新
FROM node:latest
# 执行命令,创建文件夹
RUN mkdir -p /home/node-docker
# 将根目录下的文件都copy到container(运行此镜像的容器)文件系统的文件夹下
COPY ./ /home/node-docker
# WORKDIR指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录),该指令在Dockerfile文件中可以出现多次,如果使用相对路径则为相对于WORKDIR上一次的值,
# 例如WORKDIR /data,WORKDIR logs,RUN pwd最终输出的当前目录是/data/logs。
# cd到 /home/node-docker
WORKDIR /home/node-docker
# 安装项目依赖包
RUN npm install
# RUN npm run build
# 配置环境变量
ENV HOST 0.0.0.0
ENV PORT 3000
# 容器对外暴露的端口号
EXPOSE 3000
# 容器启动时执行的命令,类似npm run start 这里增加了一个production参数标识docker生产环境
CMD ["node", "/home/node-docker/index.js", "production"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 1.同步项目文件到服务器
部署过程是本地文件传输到服务器,在服务器中执行 docker build, 所以只需要传项目源码就可以, node_modules 包不需要
我用的 rsync 将 node 项目传输到服务器
rsync -vrh --exclude={'node_modules/_','.git/_','spider/\*'} /Users/xinyun/gcy/node-server-template/ root@162.14.118.95:/usr/node-server-template
# 这里 --exclude={'node_modules/_','.git/_','spider/\*'} 语法忽略不想上传的文件夹
1
2
3
4
2
3
4
以后需要更新版本,只需要传源码重新打包即可
# 2.登陆服务器指定目录
- ssh 连接服务器
- cd /usr/node-server-template
# 3.服务器 build 镜像
docker build -t node-server-template .
docker ps
docker stop < containerID > # 停止老容器
docker rm < containerID > # 删除老容器
docker images
docker rmi < imageID > # 删除老镜像
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 4.run 镜像
docker run -d -p 3000:3000 node-server-template
- -d 表示后台运行
- -p 3000:3000 监听容器内 3000 端口并映射到宿主机 3000 端口
- node-server-template 容器名
这时输入服务器 ip+端口应该可以直接访问 node 应用了
# Nginx 转发
因为项目前后端分开部署,所以需要将前端的 API 请求通过 nginx 转发给 后端, 所以这里 nginx 需要做一些配置
先约定前端的 API 请求都加一个 /api/ 前缀
nginx 配置
server {
listen 80;
server_name demo.espe.work;
root /usr/share/nginx/html/demo/dist;
location / {
root /usr/share/nginx/html/demo/dist; # 静态资源都交给nginx部署 性能高 稳定
index index.html;
}
location /api/ {
proxy_pass http://127.0.0.1:3000/; # api 前缀的接口 走后端 后端部署在服务器的3000端口 这里3000后的 / 表示重写 /api/前缀
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
上次更新: 2023/04/05, 09:41:10