记录一次部署流程docker-compose+nestjs+vue+prisma+mysql

715 阅读3分钟

作为一家半死不活的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