Docker:若依前后端分离部署

在这里插入图片描述

  • 其余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 部署,和传统部署不同,待解决
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值