清理docker缓存
# 查看缓存
docker system df
# 删除build cache
docker builder prune
# 对应 -a 删除全部未使用的镜像,-f 或 --force 不经过确认强行删除,注意强行删除之后,镜像需要重新下载
docker system prune -a --force
1.安装docker和docker-compose
2.创建前端项目,编写Dockerfile,Nginx配置文件
项目
1.项目初始化
1.使用viet创建项目✅
https://juejin.cn/post/7228978346502946874
2.配置动态路由,路由鉴权✅
3.自定义指令✅
4.请求封装✅
5.报错,埋点,监控
6.灰度系统
7.禁止调试
8.加解密
rsa+res
2.项目根目录编写Dockerfile
# Step 1: 使用带有 Node.js 的基础镜像
FROM node:18-alpine as builderFrontend
# 设置工作目录
WORKDIR /usr/src/frontend
# 复制 package.json 和 package-lock.json(如果可用)
# COPY package*.json ./
COPY ["package.json", "package-lock.json", "./"]
# 安装项目依赖
# RUN npm install --only=production
RUN npm install --registry=https://registry.npmmirror.com
# 复制所有文件到容器中
COPY . .
# 构建应用程序
RUN npm run build
# 指定node镜像
FROM nginx:alpine
# 复制容器内的dist文件夹到nginx目录
COPY --from=builderFrontend /usr/src/frontend/dist/ /usr/share/nginx/html/
# 复制nginx配置文件
COPY ./default.conf /etc/nginx/conf.d/default.conf
3.同级目录下创建Nginx配置文件default.conf
server {
listen 7021; # 访问端口
server_name localhost;
location / {
root /usr/share/nginx/html; # nginx的静态资源目录
index index.html index.htm;
try_files $uri $uri/ /index.html; # 对于 Vue 或 React项目使用history路由需要
}
# 后端接口地址路径,使用容器名称访问
location /api {
proxy_pass http://backend:3000/;
}
}
3.创建nest项目,编写Dockerfile
1.创建项目
1.初始化✅
2.用户权限rbac,设计✅
3.日志记录
4.swagger文档
5.加解密
rsa+res
2.项目根目录编写Dockerfile
# Step 1: 使用带有 Node.js 的基础镜像
FROM node:18-alpine as builder
# 设置工作目录
WORKDIR /usr/src/backend
# 复制 package.json 和 package-lock.json(如果可用)
COPY package*.json ./
# 安装项目依赖
# RUN npm install --only=production
RUN npm install --registry=https://registry.npmmirror.com
# 安装 nest CLI 工具(确保它作为项目依赖被安装)
RUN npm install @nestjs/cli -g --registry=https://registry.npmmirror.com
# 复制所有文件到容器中
COPY . .
# 构建应用程序
RUN npm run build
# Step 2: 运行时使用更精简的基础镜像
FROM node:18-alpine
# 创建 runc 的符号链接
RUN ln -s /sbin/runc /usr/bin/runc
WORKDIR /usr/src/backend
# 从 builder 阶段复制构建好的 /usr/src/backend/dist 和 /usr/src/backend/node_modules 的文件到当工作目录
COPY --from=builder /usr/src/backend/dist ./dist
COPY --from=builder /usr/src/backend/node_modules ./node_modules
# 暴露 3000 端口
EXPOSE 3000
# 运行 Nest.js 应用程序
CMD ["node", "dist/main"]
4.编写docker-compose文件
version: "3.8"
# network
# 这个是容器内局域网网络名,这里取名app-network
networks:
app-network:
driver: bridge
services:
# 前端文件,注意这里可以当作变量在局域网内使用,前端端口名frontend
frontend:
# 指定以当前目录下的Dockerfile文件打包成镜像
build:
context: ./frontend
# image: ymss-frontend-image
container_name: ymss-frontend #容器名称,可以省略。系统会使用默认名字
restart: unless-stopped
depends_on:
- backend
ports:
- "7021:7021" # 前边是本地端口,后边是容器端口
networks:
- app-network
# 后端文件,注意这里可以当作变量在局域网内使用,后端端口名backend
backend:
# 指定以当前目录下的Dockerfile文件打包成镜像
build:
context: ./backend
# image: ymss-backend-image
container_name: ymss-backend #容器名称,可以省略。系统会使用默认名字
restart: unless-stopped
# ports:
# - "3000:3000"
expose:
- "3000"
networks:
- app-network
environment:
- BACKEND_ENV=production # 示例环境变量使用
5.接入数据库
1.接入MySQL
1.编写docker-compose文件
# Step 1: 使用带有 Node.js 的基础镜像
FROM mysql:8.0.33
# 设置工作目录
WORKDIR /usr/src/mysql
# 复制配置文件
COPY conf/my.cnf /etc/mysql/my.cnf
# 复制sql目录下的初始化文件
COPY sql/*.sql /docker-entrypoint-initdb.d/
2.初始化sql语句
-- 创建db_test数据库
-- create database `ymssdb` default character set utf8 collate utf8_general_ci;
CREATE DATABASE ymssdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
use ymssdb;
-- 创建用户表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(50) NOT NULL,
`createTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`updateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
-- 插入数据
SET NAMES utf8mb4;
INSERT INTO `user` VALUES ('1', '张三', '111111', NOW(), NOW()), ('2', '李四', '222222', NOW(), NOW()), ('3', '王五', '333333', NOW(), NOW());
-- 创建权限表
DROP TABLE IF EXISTS `permission`;
CREATE TABLE `permission` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`createTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`updateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4;
-- 插入数据
SET NAMES utf8mb4;
INSERT INTO `permission` VALUES ('1', '新增 aaa', NOW(), NOW()), ('2', '修改 aaa', NOW(), NOW()), ('3', '删除 aaa', NOW(), NOW()), ('4', '查询 aaa', NOW(), NOW()), ('5', '新增 bbb', NOW(), NOW()), ('6', '修改 bbb', NOW(), NOW()), ('7', '删除 bbb', NOW(), NOW()), ('8', '查询 bbb', NOW(), NOW());
-- 创建角色表
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`createTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`updateTime` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
-- 插入数据
SET NAMES utf8mb4;
INSERT INTO `role` VALUES ('1', '管理员', NOW(), NOW()), ('2', '普通用户', NOW(), NOW());
-- 创建角色权限关联表
DROP TABLE IF EXISTS `role_permission_relation`;
CREATE TABLE `role_permission_relation` (
`roleId` int(11) NOT NULL,
`permissionId` int(11) NOT NULL,
PRIMARY KEY (`roleId`,`permissionId`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 插入数据
SET NAMES utf8mb4;
INSERT INTO `role_permission_relation` VALUES ('1', '1'), ('1', '2'), ('1', '3'), ('1', '4'), ('1', '5'), ('1', '6'), ('1', '7'), ('1', '8'), ('2', '1'), ('2', '2'), ('2', '3'), ('2', '4');
-- 创建用户角色关联表
DROP TABLE IF EXISTS `user_role_relation`;
CREATE TABLE `user_role_relation` (
`userId` int(11) NOT NULL,
`roleId` int(11) NOT NULL,
PRIMARY KEY (`userId`,`roleId`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 插入数据
SET NAMES utf8mb4;
INSERT INTO `user_role_relation` VALUES ('1', '1'), ('2', '2'), ('3', '2');
2.接入Redis
6.运行项目
docker-compose up -d
7.创建代码信息
1.将项目打包成docker镜像
2.运行docker容器,配置一个外部端口链接docker端口
3.生成一个随机项目ID,保存进数据库
4.创建同名Nginx配置文件,放置在指定目录下
server {
listen 80;
server_name xxxx.xxx.xxx;
location / {
proxy_pass http://127.0.0.1:xxxx;
proxy_set_header Host $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;
}
}