Docker Compose 部署若依前后端分离版

本次操作系统:Ubuntu20.04 ,4核/4G,确保能连接互联网。

一、安装 dokcer、docker-compose-plugin(此处省略)

docker version
docker compose version

二、打若依后端的镜像

1、修改配置文件

Docker Compose 部署若依前后端分离版

Docker Compose 部署若依前后端分离版

Docker Compose 部署若依前后端分离版

2、编写 Dockerfile 文件

# 使用官方的 OpenJDK 8 镜像作为基础镜像
FROM openjdk:8-jdk-alpine
# 创建存放上传文件的目录
RUN mkdir -p /opt/jzsoft/upload-file-path
# 创建存放日志的目录
RUN mkdir -p /opt/jzsoft/logs
# 安装字体文件
RUN mkdir -p /etc/apk/
RUN touch /etc/apk/repositories
RUN echo -e 'https://mirrors.aliyun.com/alpine/v3.6/main/nhttps://mirrors.aliyun.com/alpine/v3.6/community/' > /etc/apk/repositories
RUN set -xe && apk --no-cache add ttf-dejavu fontconfig
# 设置工作目录
WORKDIR /opt/jzsoft
# 将构建好的 JAR 文件复制到容器中
COPY ./jzsoft-web/target/jzsoft-web.jar jzsoft-web.jar
# 暴露应用程序端口
EXPOSE 8089
# 启动应用程序
CMD ["nohup","java","-jar","/opt/jzsoft/jzsoft-web.jar", ">", "/opt/jzsoft/logs/nohup.log", "&"]

3、IDEA 连接虚拟机中的 Docker 并打镜像

首先,检查 IDEA 是否安装了 Docker 插件:

Docker Compose 部署若依前后端分离版

版本比较新的 IDEA 默认都安装了这个插件,如果没有安装,安装一下。
确保我们虚拟机上安装了 Docker 和 Docker-compose,并启动了 Docker。
找到 IDEA 下方的 Services tab 栏,按照如下操作新建一个 Docker 连接:

Docker Compose 部署若依前后端分离版

Docker Compose 部署若依前后端分离版

移除路径映射后点击 OK,右键我们创建的 Docker 连接,点击 “connection”,就连接成功了:

Docker Compose 部署若依前后端分离版

找到我们的 Dockerfile,右键这个文件,点击"Modify Run Configuration":

Docker Compose 部署若依前后端分离版

这里我们修改 Image tag,也就是镜像名称:

Docker Compose 部署若依前后端分离版

在打镜像前将我们的项目打包:

Docker Compose 部署若依前后端分离版

Docker Compose 部署若依前后端分离版

在 Dockerfile 文件的头部左侧的箭头位置点击 “Build image for dockerfile”,就会自动按照 Dockerfile 为我们打镜像:

Docker Compose 部署若依前后端分离版

打镜像完成后,就可以看到我们打的镜像了:

Docker Compose 部署若依前后端分离版

三、打若依前端的镜像

1、编写 nginx.conf 文件

在项目的根目录下创建 nginx.conf 配置文件,这个配置文件会拷贝到 ruoyi 前端镜像中,作为 Nginx 的配置文件:

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 8081;
        server_name 127.0.0.1;
        charset utf-8;

        location / {
            root /opt/jzsoft/vue;
            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://ruoyi-backend-service:8089/;
            # proxy_pass http://192.169.5.226:8089/;
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }
}

2、编写 Dockerfile 文件

# 使用 Nginx 作为基础镜像
FROM nginx:1.12.2
# 将 nginx.conf 拷贝到容器中
COPY nginx.conf /etc/nginx/nginx.conf
# 创建存放前端编译后代码的目录
RUN mkdir -p /opt/jzsoft/vue
# 将构建好的应用拷贝到 Nginx 的默认 web 目录
COPY dist /opt/jzsoft/vue
# Expose 端口
EXPOSE 8081
# 启动 Nginx 服务器
CMD ["nginx", "-g", "daemon off;"]

3、IDEA 连接虚拟机中的 Docker 并打镜像(同后端打包一样)

Docker Compose 部署若依前后端分离版

四、准备 docker compose 启动的所有容器需要的文件以及文件夹

1、准备 Redis 配置文件

找到本次部署的 Redis 7.2.0 的 redis.conf 文件,编辑其中的以下内容:

# 修改连接 redis 的密码为 123456
requirepass 123456

# 注释掉 bind 127.0.0.1,bind 用于限制访问 Redis 的机器 ip,直接关掉
# bind 127.0.0.1

2、准备初始化 SQL 文件

容器首次启动的时候,我们需要执行这些初始化文件来建表、导入数据。

quartz.sqlry_20231130.sql 在 ruoyi 后端代码根目录的 sql 文件夹中就有,直接拷贝即可,但是,需要在这两个 SQL 文件的第一行添加一行使用指定数据库的 SQL 语句:

use ry-vue;

初始化的 SQL 文件在 Ruoyi 后端项目的如下位置:

Docker Compose 部署若依前后端分离版

create-database-user.sql 负责创建用户、数据库和为用户赋权:

-- 创建数据库
CREATE DATABASE `ry-vue` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 应先创建新用户
create user 'ruoyi'@'%' identified by '123456';
-- 执行授权
GRANT ALL PRIVILEGES ON `ry-vue`.* TO 'ruoyi'@'%';
-- 刷新
flush privileges;
-- 授权远程
ALTER USER 'ruoyi'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
-- 刷新
flush privileges;

arrange-sql.sql 负责调用其他 SQL 文件,起到对 SQL 文件进行编排的作用:

source /opt/mysql-service/create-database-user.sql;
SET NAMES utf8;
source /opt/mysql-service/quartz.sql;
source /opt/mysql-service/ry_20231130.sql;

3、在宿主机中创建文件夹以及上传需要文件

/opt/project 目录的目录结构如下:

project/
└── ruoyi
    ├── docker-compose.yml -- 下面我们要编写的 docker-compose 文件
    ├── mysql-service -- 存放 mysql-service 相关文件的目录
    │   ├── other
    │   │   ├── children-sql -- 子 sql 文件存放目录
    │   │   │   ├── create-database-user.sql
    │   │   │   ├── quartz.sql
    │   │   │   └── ry_20231130.sql
    │   │   └── init -- mysql 初始化执行目录,会挂载到 docker-entrypoint-initdb.d
    │   │       └── arrange-sql.sql -- sql 编排文件,会依次调用 children-sql 文件夹中的 sql 文件
    │   └── volumes -- mysql-service 挂载的容器卷
    │       └── mysql
    └── redis-service
        └── volumes -- redis-service 挂载的容器卷
            └── redis.conf

五、编写 docker-compose.yml 文件

version: '3.8'
services:
  mysql-service:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    ports:
      - "3306:3306"
    volumes:
      - /opt/jzsoft/mysql-service/volumes/mysql:/var/lib/mysql
      - /opt/jzsoft/mysql-service/other/init:/docker-entrypoint-initdb.d/
      - /opt/jzsoft/mysql-service/other/children-sql:/opt/mysql-service/

  redis-service:
    image: redis:7.2.0-alpine3.18
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - /opt/jzsoft/redis-service/volumes/redis.conf:/usr/local/etc/redis/redis.conf
    command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ]

  jzsoft-web-service:
    image: jzsoft-web:1.0
    networks:
      - jzsoft-network
    ports:
      - "8089:8089"
    depends_on:
      - mysql-service
      - redis-service

  jzsoft-vue-service:
    image: jzsoft-vue:1.0
    networks:
      - jzsoft-network
    ports:
      - "8081:8081"
    depends_on:
      - jzsoft-web-service

networks:
  jzsoft-network:
    driver: bridge

使用如下命令启动 docker-compose 文件中的容器:

docker compose up -d

六、常见问题:

http://doc.ruoyi.vip/ruoyi/other/faq.html#linux系统验证码乱码解决方法

七、配套视频: