作为一家半死不活的mini公司的前端员工,为了公司倒闭后还能混口饭吃💘,还是要熟悉下基本的技术滴。 我感觉运维很不错嘛,喜欢这种在网络间穿梭的感觉。😄
🐼先来个最原始的版本吧,毕竟小作坊出来的。
vue部署
我是本地打成dist包,然后用scp2上传到服务器。 分享下我的dockfile和nginx的配置吧 我的dockfile就做了一件事,就是创建一个nginx容器
// Dockfile
FROM nginx:alpine
// 在服务器创建个web文件夹,我的dist上传到这里,然后拷贝到nginx容器中
COPY web/ /usr/share/nginx/html/
// 同理把我上传上来的nginx配置 拷贝到容器中
COPY nginx/default.conf /etc/nginx/conf.d/default.conf
我的nginx配置
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log /var/log/nginx/host.access.log main;
error_log /var/log/nginx/error.log error;
location / {
root /usr/share/nginx/html; # nginx的静态资源目录
index index.html index.htm;
try_files $uri $uri/ /index.html; # 对于 Vue 或 React项目使用history路由需要
}
location /api/ {
client_max_body_size 10240m;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
# 注意这里 我的后端也在docker容器中,所以这里是后端的容器名+端口号
proxy_pass http://server-container:3000/zk-manager/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
后端部署
我的后端是nestjs写的,初学者,并且nestjs部署不能向前端一样打包,扔上去dist包。而是需要把整个项目放上去,然后重新npm install 至于怎么把整个项目放上去,我不太知道,哈哈哈哈,就是这么菜😭,就直接手动从git上拉取过来了。 看看我的node后台的Dockfile配置
# 使用 Node.js 16.17.0 作为基础镜像
FROM node:16.17.0
# 将当前目录拷贝到容器中的 /app 目录下
RUN npm install -g pnpm
WORKDIR /app
COPY . .
# 安装应用程序依赖项
RUN pnpm install
# 设置环境变量
ENV NODE_ENV=production
ENV PORT=3000
# 暴露容器的 3000 端口
EXPOSE 3000
# 安装 pm2
RUN npm install -g pm2
# 设置 pm2 运行应用程序
CMD pm2-runtime start ecosystem.config.js --env production
数据库
数据库直接写在docker-compose中了
docker-compose
version: '3'
services:
frontend:
# 前端项目路径
build: ./zk-service
# 镜像名
image: frontend-image
# 容器名
container_name: frontend-container
# entrypoint:
# - sleep
# - '3600'
ports:
- 8081:80
# 自定义网络 方便容器之间 通过[容器名]通信, [ip]会变的,不方便
networks:
- mysql_bridge
# 依赖于后台服务 因为我们在前面定义的nginx中请求后台了
depends_on:
- server
# 将项目的nginx卷映射到容器中
volumes:
- ./zk-service/nginx/default.conf:/etc/nginx/conf.d/default.conf
server:
build: ./zk-service-manage-ht
image: server-image
container_name: server-container
ports:
- 8080:3000
networks:
- mysql_bridge
depends_on:
- db
db:
restart: always
image: daocloud.io/library/mysql:8.0.20
container_name: mysql-db # 容器名
ports:
- 3307:3306
networks:
- mysql_bridge
environment:
- MYSQL_ROOT_PASSWORD=syq123456
volumes:
#- /home/mysql/conf/my.cnf:/etc/mysql/my.cnf
#- /home/mysql/initdb/:/docker-entrypoint-initdb.d/
- /home/mysql/data/:/var/lib/mysql/
networks:
mysql_bridge:
这样 docker-compose up -d 就可以启动所有服务啦
整个流程是这样的
假如啊 总不能用真的ip
我的服务器 ip是 10.10.0.945
我的前端就部署到 10.10.0.945:8081上,然后我请求后台的时候,就用 10.10.0.945:8081/api/xxx来请求,但是我在nginx中代理了,所以nginx就帮我反向代理到后端容器的 http://server-container:3000/zk-manager/ 这里。然后前后端就调通啦。至于后端和数据库之间,后端就直接访问数据库的容器名和端口号就好。我在这里困了好久,我以为是要访问映射出来的3307端口,其实不是的😭,容器之间通信,访问容器的端口就好。
docker-compose 命令补充
如果我更新了 前端的包 怎么重新构建一个前端服务呢
首先 停止前端服务 docker-compose stop frontend
其次 重新构建前端服务 docker-compose build --no-cache frontend
然后再把所有的服务都启动 docker-compose up -d