Docker 容器化部署,nginx + vue3 + nestjs

446 阅读3分钟

环境: 阿里云ECS + Ubuntu24

自己写了一个把天气预报和地图结合起来的页面,方便出门的时候用 --->>> huangyn.icu/map/

前端Vue3,后端nestjs,静态资源、反向代理用nginx。

为方便部署,使用docker-compose,本地把文件组织好并压缩成zip,服务器上只需解压上传的zip,并执行 docker compose up --build一行命令即可。

下面简单罗列一下从服务器安装docker到部署项目的过程。

文件结构参考:

── app
│   ├── Dockerfile
│   ├── nestjs项目代码
── nginx
│   ├── Dockerfile
│   ├── nginx.conf 待映射的nestjs配置文件
│   ├── dist vue打包产物
├── docker-compose.yml

1、docker安装

# 更新apt
sudo apt-get update 
# 切换apt源到国内
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository -y "deb [arch=$(dpkg --print-architecture)] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 安装docker,以及compose插件
sudo apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

2、docker 国内镜像设置

在国内,不配置合适的源,会面临下载不了镜像的问题,会超时。注意,阿里云的源不好用,自己找源来用:

www.coderjia.cn/archives/db…

修改文件 /etc/docker/daemon.json(如果不存会自动创建,源要带 https://),并重启服务。

完成这一步后,docker就可以正常启动我们的项目了。 注意,daemon.json的内容,直接复制的空格有问题,需要自行替换下。否则会导致docker启动失败

# 创建目录
sudo mkdir -p /etc/docker
# 写入配置文件
sudo tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
      "https://docker.unsee.tech",
      "https://dockerhub.icu"
    ]
}
EOF
# 重启docker服务
sudo systemctl daemon-reload && sudo systemctl restart docker

3、nestjs安装与运行

nestjs 需要在服务器中进行安装,所以我们需要在nestjs所在这个镜像中执行一些命令,以便顺利执行。

下面的Dockerfile文件包含了一系列操作:使用node18的镜像作为基础,切换npm国内源,安装pnpm,安装项目依赖,启动项目。

── app
│   ├── Dockerfile

# Start from the official Node.js image
FROM node:18
​
# Set the working directory in the container
WORKDIR /usr/src/app
​
# 使用国内镜像
RUN npm config set -g registry https://registry.npmmirror.com
​
# 安装 pnpm
RUN npm install -g pnpm
​
# 复制 package.json + pnpm-lock.yaml 到镜像文件中
COPY package.json pnpm-lock.yaml ./
​
# 执行 pnpm install
RUN pnpm install
​
# 复制我们写的源码
COPY . .
​
# build
RUN pnpm run build
​
# 启动
CMD ["pnpm", "run", "start:prod"]

4、nginx配置,静态资源,反向代理

为了处理静态资源访问和反向代理的问题,我们一般会有一个nginx配置文件nginx.conf,这个文件可以使用docker-compose.yml映射到容器中。

这样就无需进行繁琐的操作:进入镜像启动终端 - 复制配置文件 - 重启ng。

vue3打包后的产物,我用DockerFile复制到镜像中了,理论上也可以直接映射进去。

# docker-compose.yml
nginx:
    build:
      context: ./nginx
    ports:
      - "80:80"
    # apply nginx config
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    depends_on:
── nginx
│   ├── Dockerfile

# nginx配置文件映射,写在上级目录docker-compose.yml中
# 使用官方的Nginx镜像
FROM nginx:stable-alpine
​
# 复制vue打包文件
COPY /dist /usr/share/nginx/html/
​
# 暴露端口
EXPOSE 80
​
# 启动nginx
CMD ["nginx", "-g", "daemon off;"]

5、启动项目

完成上面步骤,我们就可以在docker-compose.yml所在的目录中执行docker compose up --build启动整个项目.

其实首次运行是可以不带build的,但当你更新了vue或nestjs的代码后,就需要带上build。

附上docker-compose.yml供参考

version: '3'
services:
  app:
    build:
      context: ./app
    ports:
      - "3000:3000"
    depends_on:
      - mongodb
  nginx:
    build:
      context: ./nginx
    ports:
      - "80:80"
    # apply nginx config
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - app
  mongodb:
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: XXXX
      MONGO_INITDB_ROOT_PASSWORD: XXXXXXX
    volumes:
      - mongodb_data:/data/db
    ports:
      - "XXXXX:27017"
volumes:
  mongodb_data: