# 一、稳健部署版

  将除 git、node、Maven 外的环境,都以 docker 镜像的方式存在

TIP

  Dockerfile 编写简单,但操作步骤繁杂(和原生的部署方式没什么区别,仅仅可以做版本控制),并且 docker 中会生成许多相互关联的 image。

目录说明

  服务器的文件目录说明:

home 目录类似于 window 上的 D 盘

# 存放docker镜像的地方
docker search redis # docker hub

# 存放软件环境
mkdir -p /data/docker_service

# ----------

# 临时存放Git项目代码
# mkdir -p /home/app_code

# 存放已部署上线的项目
# mkdir -p /data/app

# 1、代码拉取

cd /home/app_code
git clone [email protected]:y_project/RuoYi-Vue.git

# 2、SQL 导入

  • 方式 1

在容器的 mysqld 中操作

# 将SQL文件映射到容器
cp -p /home/app_code/RuoYi-Vue/sql /data/docker_service/mysql/data


docker ps -a
# 进入容器
docker exec -it [容器id或name] /bin/bash

mysql -u root -p
> create database ry-vue;
> Show databases;
> use ry-vue;
> source /var/lib/mysql/quartz.sql;
> show tables;
> source /var/lib/mysql/ry_20230706.sql;
> show tables;

# 退出容器
exit
  • 方式 2

使用 Navicat

# 3、后端打包

  以下演示的是在服务端进行打包(优点是不需要配置 jdk 为 1.8)

为了项目的正常运行,建议先在本地修改文件配置文件、并运行项目以验证项目是否能够正常运行

# Maven打包
cd /home/app_code/RuoYi-vue
mvn clean install -pl com.ruoyi:ruoyi-admin -am  # 为非模块时可以直接执行mvn package命令

# jar包迁移
mkdir /data/app/ruoyi-vue
mv /home/app_code/RuoYi-vue/ruoyi-admin/target/ruoyi-admin.jar /data/app/ruoyi-vue/ruoyi-admin.jar

# -------

# 编写Dockerfile
cd /data/app/ruoyi-vue
vim Dockerfile

# 构建新镜像
cd /data/app/ruoyi-vue
docker build -t ruoyi:1.0
docker images

# -------

# 启动镜像(-d表示后台运行)
docker run -p 3001:3000 --name ruoyi -d ruoyi:1.0

# 检查是否启动成功
docker logs --tail 1000 -f [容器id]
Dockerfile 编写
#基础镜像使用jdk1.8
FROM java:8

#作者
MAINTAINER lencamo

# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp

# 将jar包添加到容器中并更名
ADD ruoyi-admin.jar app.jar

# 运行jar包
RUN bash -c 'touch /app.jar'

# 为了缩短 Tomcat 启动时间,添加一个系统属性指向 “/dev/./urandom” 作为 Entropy Source
#ENTRYPOINT ["nohup","java","-jar","/data/cat/ruoyi-admin.jar","&"]
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

#暴露3000端口
EXPOSE 3000

# 4、前端打包

# webpack打包
cd /home/app_code/RuoYi-Vue/ruoyi-ui
npm install --unsafe-perm --registry=https://registry.npm.taobao.org
npm run build:prod

# jar包迁移
mkdir /data/app/ruoyi-ui
mv /home/app_code/RuoYi-Vue/ruoyi-ui/dist/* /data/app/ruoyi-ui/

# Nginx代理
vim /usr/local/nginx/conf/nginx.conf
Nginx 配置
user root

http{
  server {
    listen 80;
    server_name  localhost;

    location / {
      root  /data/app/ruoyi-ui;
      try_files $uri $uri/ /index.html;
      index  index.html index.htm;
    }

    location /prod-api/ {
      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;

      proxy_pass http://localhost:5151/;
    }
  }
}

# 二、高效部署版 🎈

  采用多阶段构建方式编写 dockerfile,直接将项目 build 成一个单独的镜像,数据库部分的 container 则单独管理(需要迁移的时候将其 commit 成 image 即可)。

TIP

  image 管理相对方便,但 dockerfile 编写会复杂一些(一切以镜像较小为目标)。

# 1、后端部署

yum install git -y
git clone https://gitee.com/y_project/RuoYi-Vue.git

cd RuoYi-Vue
vim Dockerfile

docker build -t ruoyi-admin:v1.0 .
docker run -itd --name ruoyi-admin -p 5051:8080 ruoyi-admin:v1.0
  • Dockerfile
FROM maven:3.8.6-amazoncorretto-19
COPY ./ /ruoyi
WORKDIR /ruoyi
RUN mvn clean install -pl com.ruoyi:ruoyi-admin -am

FROM openjdk:8
RUN mkdir -p /app/ruoyi-admin
COPY --from=0 /ruoyi/ruoyi-admin/target/ruoyi-admin.jar /app/ruoyi-admin
WORKDIR /app/ruoyi-admin
CMD ["java","-jar","ruoyi-admin.jar"]
EXPOSE 8080

# 3、前端部署

提示

  如果前端项目直接调用的是 后端接口 ip 地址,那么也可以不进行 nginx 代理(该容器本身就它一个项目 😂)。

只是前端写 ip 地址的话,请求地址会被固定死,从而无法修改(代理)

yum install git -y
git clone https://gitee.com/y_project/RuoYi-Vue.git

cd RuoYi-Vue/ruoyi-ui
vim nginx.conf
vim Dockerfile

docker build -t ruoyi-ui:v1.0 .
docker run -itd --name ruoyi-ui -p 81:80 ruoyi-ui:v1.0
nginx.conf
user  root;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;

        location / {
          root  /app/ruoyi-ui;
          try_files $uri $uri/ /index.html;
          index  index.html index.htm;
        }
        location /prod-api/ {
          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;

          proxy_pass http://43.138.42.251:5051/;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
  • Dockerfile
FROM node:16.18.0
COPY ./ /ruoyi-ui
WORKDIR /ruoyi-ui
RUN npm install --registry=https://registry.npmmirror.com/
RUN npm run build:prod

FROM nginx:1.17.10
RUN mkdir -p /app/ruoyi-ui
COPY --from=0 /ruoyi-ui/dist /app/ruoyi-ui
COPY ./nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

# 3、自动化脚本

#! /bin/bash

buildImage()
{
  yum install git -y
  git clone https://gitee.com/Lencamo/RuoYi-Vue.git
  cd ./RuoYi-Vue/ruoyi-ui
  docker build -t ruoyi-ui:v1.0 .
  cd ..
  docker build -t ruoyi-admin:v1.0 .
  docker pull mysql:5.7.40
  docker pull redis:6.0.8
}

startDatabase() {
  docker run -p 3307:3306 --name mysql --privileged=true -e MYSQL_ROOT_PASSWORD=mysql666 -d mysql:5.7.40
  docker run -p 6380:6379 --name redis --privileged=true -d redis:6.0.8 --requirepass "redis666"
  # docker-compose up -d
}

startRuoyi()
{
  docker run -itd --name ruoyi-ui -p 81:80 ruoyi-ui:v1.0
  docker run -itd --name ruoyi-admin -p 5051:8080 ruoyi-admin:v1.0
  # docker-compose up -d
}

help()
{
  echo "步骤1(构建镜像):sh ruoyi.sh buildImage"
  echo "步骤2(启动数据库):sh ruoyi.sh startDatabase"
  echo "步骤3:连接mysql数据库并上传SQL文件"
  echo "步骤4(启动项目):sh ruoyi.sh startRuoyi"
	exit 1
}

case $1 in
  "buildImage") buildImage
  ;;
  "startDatabase") startDatabase
  ;;
  "startRuoyi") startRuoyi
  ;;
  *) help
  ;;
esac

# 三、整体构建版

  拉取一个 centos7 镜像,然后在里面进行一个完整的项目部署

缺点:部署过程依旧繁琐,docker 环境不能被多个项目复用

优点:可移植,一个镜像即一个完整的项目

# 四、容器编排版

  个人感觉容器编排技术脱离的 微服务 是没有意义的,还不如使用 shell 脚本

docker-compose.yml

使用参考:https://www.bilibili.com/video/BV1dP411k7rR/

更新于 : 8/7/2024, 2:16:31 PM