docker 部署 nuxt 项目到阿里云 ECS

偏向技术
/ 0 评论 / 108 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年10月19日,已超过1129天没有更新,若内容或图片失效,请留言反馈。

使用 Webstorm IDE 和插件 Alibaba Cloud Toolkit,结合 docker-compose 快速部署 nuxt 项目到阿里云 ECS 服务器

概述

有一个使用 nuxtjs 开发的 ssr 网站,需要部署到阿里云 ECS,部署的方法有很多,根据需求不同,有几点需要注意:

  1. ssr 项目,不可避免的会有 node_modules 文件夹,文件过多上传会导致超时,需要打包成压缩文件上传以节省上传时间
  2. 开发机器系统为 Windows,避免系统差异,需要使用 docker 进行依赖安装和编译,交给开发机器执行以节省服务器资源
  3. 尽可能减少部署所需的操作,通过脚本执行 docker 相关命令,通过 Webstorm IDE 的 Alibaba Cloud Toolkit 插件,选择 Deploy to ECS 功能,自动在上传文件后执行相应命令

操作

在 package.json 中添加一条命令 "build:docker": "sh build.docker.sh",方便执行 docker 打包编译命令,这里有两个前提条件是,docker 正在运行和支持 sh 命令。

Dockerfile.build

添加 Dockerfile.build 文件用于打包编译时执行,简单的流程如下,进入工作目录 - 复制源码 - 下载依赖并编译 - 移除多余依赖 - 删除多余文件 - 压缩最终代码

dockerfile
# Dockerfile.build
FROM node:lts-alpine3.14
WORKDIR /code
COPY . .
RUN npm install && npm run build
RUN npm prune -qs --no-audit --loglevel error --production
RUN rm components layouts middleware pages plugins styles test types .babelrc .env .env.dev .eslintrc.js .prettierrc jest.config.js tsconfig.json Dockerfile.build build.docker.sh -rf
RUN tar -czf /dist.tar.gz .
CMD ["/bin/bash"]
123456789

build.docker.sh

添加 build.docker.sh 文件,编写需要执行的命令,简单的流程如下,构建编译时镜像 - 启动容器 - 复制文件到本地 - 删除容器

shell
#!/bin/bash

imageName='liuq/yunpansoso-web-building:0.0.1'
label='yunpansoso-web-building'
docker build -f Dockerfile.build -t $imageName --label $label .
docker run -d $imageName
containerID=`docker ps --filter=label=$label -aq`
mkdir output -p
docker cp $containerID:/dist.tar.gz ./output/dist.tar.gz
docker rm $containerID -f
12345678910

Alibaba Cloud

在 Webstorm IDE 中选择 Tools - Alibaba Cloud - Deploy to ECS,选择压缩文件目录 ./output/dist.tar.gz,选择账号下的 ECS 服务器,在 Target Directory 中输入服务器上部署的路径,以 /var/www/yunpansoso/web 为例,接着选择命令,添加一条命令 tar -xzf dist.tar.gz && docker-compose up -d --force-recreate,选择 Advanced,在 Before deploy 中选择命令,添加一条命令 rm /var/www/yunpansoso/web -rf,在部署前清空目录。

docker-compose.yml 和 Dockerfile

服务器上用于 docker-compose up 的文件如下,此外还使用了公用 nginx-proxy 服务用于转发多个网站

yaml
# docker-compose.yml
version: '3'
services:
  yunpan-nginx:
    image: nginx:stable-alpine
    container_name: yunpan-nginx
    restart: always
    ports:
      - 8081:80
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
  yunpan-web:
    container_name: xxx-web
    image: liuq/yunpansoso-web-web:0.0.1
    restart: always
    build: .
    ports:
      - 9001:9001
    volumes:
      - ./:/code
1234567891011121314151617181920
dockerfile
# Dockerfile
FROM node:lts-alpine3.14
WORKDIR /code
CMD ["npm", "start"]
1234

公用 nginx-proxy 服务

nginx-proxy 文件如下,简单文件直接通过 Alibaba Cloud 步骤执行即可

yaml
# docker-compose.yml
version: "3"
services:
  nginx-proxy:
    image: nginx:stable-alpine
    container_name: nginx-proxy-basic
    restart: always
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
123456789101112
nginx
# nginx.conf
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  300;
    server {
        listen       80;
        server_name  www.example.com;
        location / {
          proxy_pass  http://<公网 IP 地址>:8081;
        }
    }
}
1234567891011121314151617

结果

最终需要执行的步骤:

  1. npm run build:docker
  2. 点击右上角的 Run 命令

文件大小约28.4M,第一步打包编译耗时104.0s左右,第二步上传解压执行耗时约78.554s左右

总结

通过 webstorm IDE 插件 Alibaba Cloud Toolkit 可以免于再次连接服务器,只要步骤正确,基本无需进行额外操作,多个操作步骤写在一个脚本文件中,更是方便快捷,爽歪歪 ^^v^^

0

评论 (0)

取消