- 其余mysql、redis配置见前面的传统方式
- 缺少jenkins自动化构建、发布编排
- docker:资源、权限控制,故障自愈【本机销毁重建】
- k8s容器编排:分布式、故障自愈【销毁,到其他节点重建】、自动扩缩容、统一构建及管理、sidecar、RBAC基于角色的访问控制、各种资源控制
- docker制作镜像,是K8S的基础。
零、创建自定义网络
10.0.0.0 - 10.255.255.255 (10.0.0.0/8)
172.16.0.0 - 172.31.255.255 (172.16.0.0/12)
192.168.0.0 - 192.168.255.255 (192.168.0.0/16)
docker网络是B类网络,,默认bridge网络是172.17.0.0/16
docker network create brnet-ry --subnet=172.18.0.0/16 --gateway=172.18.0.1
一、后端增加配置
CREATE DATABASE `ry-vue` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `ry-vue`;
# 容器地址不固定,使用通配符
(1)CREATE USER 'ry'@'172.18.%' IDENTIFIED BY '123456'; # 正确
(2)# mysql 8.0以下
create user 'ry'@'%' identified by '123456';
(3)# mysql 8.0以上
create user 'ry';
grant all on `ry-vue`.* to 'ry'@'%';
# 此处直接用%容器不能连接mysql原因未知
# 必须要用(1)的方法,不能用grant授权'ry'@'172.18.%' 原因未知
# 8.0.40-0ubuntu0.22.04.1 (Ubuntu)
FLUSH PRIVILEGES;
source /root/ruoyi-vue/sql/quartz.sql;
source /root/ruoyi-vue/sql/ry_20240629.sql;
1. 新建RuoYi-Vue/docker/ruoyi-admin/Dockerfile
# 使用标准 Maven 镜像进行构建,不要用onbuild!maven会按照上级设置maven路径找pom
FROM maven:3.5.0-jdk-8-alpine as builder
# 设置工作目录
WORKDIR /app
# 替换 APK 源为国内源,加速构建过程
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/' /etc/apk/repositories && \
apk update && \
apk add git
# 克隆项目
RUN git clone https://gitee.com/******/RuoYi-Vue.git .
# 构建项目
RUN mvn clean package -Dmaven.test.skip=true
# 使用基础 Java 镜像运行构建结果
FROM openjdk:8-jre-alpine
WORKDIR /ruoyi-admin
# 复制构建产物到新镜像中
COPY --from=builder /app/ruoyi-admin/target/ruoyi-admin.jar /ruoyi-admin/ruoyi-admin.jar
# 创建上传目录
RUN mkdir /ruoyi/uploadPath -p
# 配置容器启动命令
CMD ["java", \
"-Dname=ruoyi-admin.jar", \
"-Duser.timezone=Asia/Shanghai", \
"-Xms512m", \
"-Xmx1024m", \
"-XX:MetaspaceSize=128m", \
"-XX:MaxMetaspaceSize=512m", \
"-XX:+HeapDumpOnOutOfMemoryError", \
"-XX:+PrintGCDateStamps", \
"-XX:+PrintGCDetails", \
"-XX:NewRatio=1", \
"-XX:SurvivorRatio=30", \
"-XX:+UseParallelGC", \
"-XX:+UseParallelOldGC", \
"-jar", "/ruoyi-admin/ruoyi-admin.jar"]
docker build -t admin .
#缺少本地挂载,代码直接放在了容器中
docker run -tid --name admin \
--network brnet-ry \
-p 8080:8080 \
--restart=always \
admin:latest
对应的docker-compose文件
version: "2.4"
services:
admin:
container_name: admin
networks:
- brnet-ry
ports:
- 8080:8080
restart: always
image: admin:latest
二、前端增加配置
2.1 新建RuoYi-Vue/docker/vue-nginx/ruoyi-ui-dist
2.2 新建RuoYi-Vue/docker/vue-nginx/cp-dist.sh
#!/bin/bash
cd /root/RuoYi-Vue/docker/vue-nginx/
cp -rf /root/RuoYi-Vue/ruoyi-ui/* ruoyi-ui-dist/
tar zcvf ruoyi-ui-dist.tar.gz ruoyi-ui-dist/
2.3 新建RuoYi-Vue/docker/vue-nginx/ruoyi.conf
#upstream ruoyi {
#ip_hash;
# server 192.168.31.20:8080;
# server 192.168.31.5:8080;
#}
server {
listen 80;
server_name www.ruoyi.com;
charset utf-8;
access_log logs/ruoyiaccess.log main;
error_log logs/ruoyierror.log;
location / {
root /data/ruoyi/dist;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /prod-api/ {
# proxy_pass http://192.168.31.20:8080/;
# 使用自定义网络,可以在其中直接借用其容器名
proxy_pass http://admin:8080/;
# proxy_pass http://ruoyi/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
2.4 新建RuoYi-Vue/docker/vue-nginx/Dockerfile
docker login --username=天空中的鱼 registry.cn-hangzhou.aliyuncs.com
FROM node:16.19 AS build
# COPY ./ruoyi-ui-dist/* /ruoyi-ui-vue/
ADD ruoyi-ui-dist.tar.gz /
WORKDIR /ruoyi-ui-dist/
RUN npm install --registry=https://registry.npmmirror.com
RUN npm run build:prod
FROM registry.cn-hangzhou.aliyuncs.com/qiushi/alpine-3.18.0-v1-nginx:v1
COPY --from=build /ruoyi-ui-dist/dist /data/ruoyi/dist
COPY ruoyi.conf /apps/nginx/conf/conf.d/ruoyi.conf
#添加字体
RUN set -xe \
&& apk --no-cache add ttf-dejavu fontconfig
CMD ["nginx", "-g","daemon off;"]
docker build --no-cache -t vue-nginx:v1 .
docker run -tid --name vue-nginx \
--network brnet-ry \
-p 80:80 \
--privileged=true \
--restart=always \
vue-nginx:v1
对应的docker-compose文件
version: "2.4"
services:
vue-nginx:
container_name: vue-nginx
networks:
- brnet-ry
ports:
- 80:80
privileged: true
restart: always
image: vue-nginx:v1
宿主机配置必须域名解析,因为nginx做了额外的域名配置,访问ip会直接到默认配置
192.168.31.20 www.ruoyi.com
三、待优化
1、缺少本地挂载,代码直接放在了容器中,如何优化?
答:类似K8S的argo编排的任务容器,docker中也可以在dockerfile中编排,完成任务后销毁,只需要没有持续运行的前台进程(pid=1的进程)。即前端容器剥离,前端容器临时容器,任务完成后销毁,
方案1:构建后文件docker cp到本地。
方案2:容器启动,宿主机任意本地目录A挂载容器内目录B,容器内将构建文件cp到B,从而在宿主机目录A永久保留,然后容器销毁。
方案3:传统非容器部署前端程序。
注意:宿主机目录挂载容器目录会覆盖后者。
2、使用docker-compose编排,保留yml文件的目的,命令不易保存
将 Docker Run 命令转换为 Docker Compose 配置:在线工具操作指南
https://blog.youkuaiyun.com/u014394049/article/details/142957195
https://www.composerize.com/
version: "2.4"
services:
admin:
container_name: admin
networks:
- brnet-ry
ports:
- 8080:8080
restart: always
image: admin:latest
vue-nginx:
container_name: vue-nginx
networks:
- brnet-ry
ports:
- 80:80
privileged: true
restart: always
image: vue-nginx:v1
四、遗留问题
docker 部署,和传统部署不同,待解决