Docker部署若依(前后端分离版)

一、代码拉取

环境准备,先去若依官网拉取前后端代码

RuoYi-Vue: 🎉 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统,同时提供了 Vue3 的版本

gitee上拉取下来就能获取到

代码结构如上,其中ruoyi-vue是前端代码。

其中sql打开执行一下,创建出需要的基础数据库并导入数据(数据库一般不直接放在docker中,自己看情况确定)也可以选择在docker中部署mysql和redis

如果选择在docker中部署的话,则把配置文件中的ip地址换成对应的容器名称,如localhost换成mysql

二、所需环境搭建

1、创建项目的网络环境

bash 复制代码
docker network create ry-net

默认就是桥接的

创建文件夹,用于存放文件(如mysql的Dockerfile等)

bash 复制代码
cd /usr/local

mkdir ruoyi-admin

cd ruoyi-admin

mkdir mysql

mkdir nginx

mkdir ry-vue

2、Mysql

在docker中部署mysql(如果使用docker compose一键部署的话,忽略掉这步)

进入mysql目录,上传若依文件中的sql文件,

构建Dockerfile文件,用于执行初始化脚本等操作

bash 复制代码
vim Dockerfile
bash 复制代码
FROM mysql

# 作者信息
LABEL maintainer="JHA"

# 设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 复制字符集配置文件
COPY my.cnf /etc/mysql/conf.d/

# 创建初始化脚本目录
RUN mkdir -p /docker-entrypoint-initdb.d

# 复制 SQL 脚本到容器
COPY quartz.sql /docker-entrypoint-initdb.d/
COPY ry_20250522.sql /docker-entrypoint-initdb.d/

WORKDIR /docker-entrypoint-initdb.d
# 设置权限
RUN chmod 644 /docker-entrypoint-initdb.d/*.sql

# 设置环境变量
ENV MYSQL_ROOT_PASSWORD=954321
ENV MYSQL_DATABASE=ry-vue
ENV MYSQL_USER=ruoyi
ENV MYSQL_PASSWORD=954321

# 暴露端口
EXPOSE 3306

创建镜像

bash 复制代码
docker build -t my-mysql:1.0 .

执行命令,用于创建mysql容器

bash 复制代码
docker run \
  --name mysql \
  -d \
  -p 3306:3306 \
  --restart=always \
  -e MYSQL_ROOT_PASSWORD=954321 \
  -e MYSQL_DATABASE=ry-vue \
  -e TZ=Asia/Shanghai \
  -v /docker/mysql/log:/var/log/mysql \
  -v /docker/mysql/data:/var/lib/mysql \
  -v /docker/mysql/conf:/etc/mysql/conf.d \
  -v /etc/localtime:/etc/localtime:ro \
  --network ry-net \
  my-mysql:1.0

如果返回容器id则说明创建成功,查看容器 docker ps

可以看到mysql容器就创建成功了,使用工具进行测试,看是否能够正常使用

看到ry-vue数据库也创建成功了,说明我们的mysql容器就创建好了,

3、redis

在docker中部署redis(如果使用docker compose一键部署的话,忽略掉这步)

执行命令,用于创建redis容器,这里我是用宿主机的6380来映射容器内的6379,因为我这边的宿主机的6379被占用了,这个不用管,我们的配置文件端口还是6379,这个6380是给宿主机用的,通过宿主机ip:6380访问,我们容器内走的还是6379

bash 复制代码
docker run --name redis \
-p 6380:6379 \
-v /docker/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /docker/redis/data:/data \
-v /docker/redis/logs:/logs \
--network ry-net \
-d --restart=always redis:7.4.0 redis-server /etc/redis/redis.conf

docker ps 进行验证 看看是否启动

4、jdk8环境准备

这个看情况,我是因为镜像下载下来不好用,所以我选择自己封一个jdk8的环境

1、基础环境拉取

首先,拉取一个linux镜像,我选择centos7,看个人选择

bash 复制代码
docker pull centos:7

2、下载jdk

建议从官网下载: Java Downloads | Oracle

下滑找到jdk8,linux版本的,可以看到有很多版本,我们需要根据我们容器的内核版本来选择,看看是64位还是32位,使用

bash 复制代码
uname -m

如果返回的是x86_64 ,那么就是64位的,下载

32位下载

创建文件夹,用来存储下载好的jdk文件

bash 复制代码
mkdir -p /usr/local/jdk
 
cd /usr/local/jdk

3、将下载好的文件上传到宿主机,

然后解压文件夹

bash 复制代码
tar -zxvf jdk-8u471-linux-x64.tar.gz

4、创建Dockerfile

bash 复制代码
vim Dockerfile

内容如下:

bash 复制代码
FROM centos:7
MAINTAINER JHA
RUN mkdir /usr/local/jdk
WORKDIR /usr/local/jdk
ADD jdk-8u471-linux-x64.tar.gz /usr/local/jdk
 
# 设置环境变量
ENV JAVA_HOME /usr/local/jdk/jdk1.8.0_471
ENV JRE_HOME $JAVA_HOME/jre
ENV PATH $JAVA_HOME/bin:$PATH

如果下载的jdk版本号不一样,对应修改一下版本号就行,做完这一切之后文件目录如下:

5、构建jdk1.8镜像

bash 复制代码
docker build -t jdk1.8 .
bash 复制代码
[root@192 jdk]# docker build -t jdk1.8 .
DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
            Install the buildx component to build images with BuildKit:
            https://docs.docker.com/go/buildx/

Sending build context to Docker daemon  262.4MB
Step 1/8 : FROM centos:7
 ---> eeb6ee3f44bd
Step 2/8 : MAINTAINER 123
 ---> Running in 881b5d5f5753
 ---> Removed intermediate container 881b5d5f5753
 ---> cac69162c17a
Step 3/8 : RUN mkdir /usr/local/jdk
 ---> Running in 7da920a36511
 ---> Removed intermediate container 7da920a36511
 ---> 1e128ef9cab1
Step 4/8 : WORKDIR /usr/local/jdk
 ---> Running in b9bc63fe6bfb
 ---> Removed intermediate container b9bc63fe6bfb
 ---> fee06b7f5093
Step 5/8 : ADD jdk-8u471-linux-x64.tar.gz /usr/local/jdk
 ---> 5a5acaa09ab4
Step 6/8 : ENV JAVA_HOME /usr/local/jdk/jdk1.8.0_471
 ---> Running in 998188ee3502
 ---> Removed intermediate container 998188ee3502
 ---> 42368829bd1e
Step 7/8 : ENV JRE_HOME $JAVA_HOME/jre
 ---> Running in 6058914f937e
 ---> Removed intermediate container 6058914f937e
 ---> 6cbd6c77530f
Step 8/8 : ENV PATH $JAVA_HOME/bin:$PATH
 ---> Running in 2a3922b783a2
 ---> Removed intermediate container 2a3922b783a2
 ---> b9f455b69823
Successfully built b9f455b69823
Successfully tagged jdk1.8:latest
[root@192 jdk]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
jdk1.8       latest    b9f455b69823   5 seconds ago   387MB
nginx        latest    058f4935d1cb   9 days ago      152MB
mysql        latest    00f3a44f3de1   5 weeks ago     932MB
redis        7.4.0     7e49ed81b42b   17 months ago   117MB
mysql        9.0.1     c757d623b190   17 months ago   586MB
centos       7         eeb6ee3f44bd   4 years ago     204MB

可以看到已经有了jdk1.8的镜像了,我们运行然后测试看看

6、测试jdk1.8镜像

创建容器并进行测试

bash 复制代码
docker run -di --name=jdk1.8 jdk1.8

测试是否存在java环境

bash 复制代码
docker exec -it 0868ba1068b08fe0a841f7b5b16a8487c0f77f915bbc4e00b7b3e141f5fba36d /bin/bash

执行

bash 复制代码
java -version

返回

bash 复制代码
java version "1.8.0_471"
Java(TM) SE Runtime Environment (build 1.8.0_471-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.471-b09, mixed mode)
[root@0868ba1068b0 jdk]# 

这样就说明成功构建了jdk8环境

三、后端部署

1、后端打包

找到主目录进行打包,打包后的文件再ruoyi-admin的target中

可以选择使用maven进行打包

构建完成之后在admin中的target下

2、上传文件

宿主机中创建文件,用于存储后端文件

bash 复制代码
cd /usr/local/

mkdir ry-vue
 
cd ry-vue

将打包好的jar包上传到宿主机中

3、创建Dockerfile

bash 复制代码
vim Dockerfile
bash 复制代码
# 使用自定义 JDK 1.8 镜像
FROM jdk1.8:latest
 
# 设置工作目录
WORKDIR /app
 
# 复制 JAR 文件到容器
COPY ruoyi-admin.jar /app/ruoyi-admin.jar
 
# 暴露应用端口
EXPOSE 8080
 
# 设置启动命令
ENTRYPOINT ["java", "-Duser.timezone=Asia/Shanghai", "-jar", "/app/ruoyi-admin.jar"]

也可以使用Docker的官方镜像(推荐)

bash 复制代码
# 使用自定义 JDK 1.8 镜像
FROM openjdk:8u121-jdk
 
# 设置工作目录
WORKDIR /app
 
# 复制 JAR 文件到容器
COPY ruoyi-admin.jar /app/ruoyi-admin.jar

# 暴露应用端口
EXPOSE 8080
  
 
# 设置启动命令
ENTRYPOINT ["java", "-Duser.timezone=Asia/Shanghai", "-jar", "/app/ruoyi-admin.jar"]

4、构建运行镜像

bash 复制代码
docker build -t ruoyi-admin:1.0 .

返回

bash 复制代码
DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
            Install the buildx component to build images with BuildKit:
            https://docs.docker.com/go/buildx/

Sending build context to Docker daemon   88.7MB
Step 1/5 : FROM jdk1.8:latest
 ---> b9f455b69823
Step 2/5 : WORKDIR /app
 ---> Running in 3f4ed62db261
 ---> Removed intermediate container 3f4ed62db261
 ---> 8ba1d89a4df0
Step 3/5 : COPY ruoyi-admin.jar /app/ruoyi-admin.jar
 ---> 43f170cdcc3f
Step 4/5 : EXPOSE 8080
 ---> Running in 31388134adca
 ---> Removed intermediate container 31388134adca
 ---> c2b8395b7855
Step 5/5 : ENTRYPOINT ["java", "-Duser.timezone=Asia/Shanghai", "-jar", "/app/ruoyi-admin.jar"]
 ---> Running in 6663957b0271
 ---> Removed intermediate container 6663957b0271
 ---> b42e9bd633d0
Successfully built b42e9bd633d0
Successfully tagged ruoyi-admin:1.0

这样就成功构建了后端的运行镜像,创建容易即可直接运行了

5、运行后端接口

bash 复制代码
docker run -d --name ruoyi-admin \
   -p 8080:8080 \
   --restart=always \
   -v /usr/local/ruoyi-admin/ry-vue/logs:/app/logs \
   -v /usr/local/ruoyi-admin/ry-vue/ruoyi-admin.jar:/app/ruoyi-admin.jar \
   --network ry-net \
   ruoyi-admin:1.0

5、测试运行状态

我们可以通过接口工具调用login接口,用户密码默认为admin,admin123

可以看到,成功调用到了接口,这样子,后端就部署成功了!

四、前端部署

1、前端打包

我们这里采用的是nginx进行部署

1、文件生成

使用vscode打开前端文件ruoyi-ui

执行 npm安装命令

bash 复制代码
npm install --registry=https://registry.npmmirror.com

执行npm打包命令

bash 复制代码
npm run build:prod

打包后会生成一个dist文件夹

2、文件上传

创建资源存放目录

bash 复制代码
cd /usr/local

mkdir nginx/data

cd data

mkdir conf

mkdir html

将dist文件夹上传到html中

在**/docker/nginx/data/conf** 创建 nginx.conf文件

bash 复制代码
vim nginx.conf
bash 复制代码
worker_processes auto;

events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile      on;
    keepalive_timeout 65;

    server {
        listen 80;
        server_name 192.168.1.130; #改成服务器的ip 

        root /usr/share/nginx/html;
        index index.html;

        # 静态文件服务及前端路由支持(history 模式)
        location / {
            try_files $uri $uri/ /index.html;
        }

        # API代理:将 /prod-api 前缀的请求转发到后端服务器
        location /prod-api/ {
            # 如果需要移除前缀,使用 rewrite 去除前缀后再转发至后端根路径
            rewrite ^/prod-api/(.*)$ /$1 break;
            proxy_pass http://ruoyi-admin:8080;  #配置后端服务的容器名
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

2、运行nginx

bash 复制代码
docker run -d --name nginx\
   -p 80:80 \
   --restart=always \
   -v /usr/local/ruoyi-admin/nginx/data/conf/nginx.conf:/etc/nginx/nginx.conf \
   -v /usr/local/ruoyi-admin/nginx/data/html/dist:/usr/share/nginx/html \
   --network ry-net\
 nginx

我们直接访问ip:80就可以访问到页面了

扩展Docker Compose一键部署

文件放在同一个目录下,如下

新建一个docker-compose文件

bash 复制代码
vim docker-compose
bash 复制代码
services:
  mysql:
    container_name: mysql
    hostname: mysql
    build:
      context: ./mysql
      dockerfile: Dockerfile
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 954321
      MYSQL_DATABASE: ry-vue
      MYSQL_USER: ruoyi
      MYSQL_PASSWORD: 954321
      TZ: Asia/Shanghai
    volumes:
      - /docker/mysql-data:/var/lib/mysql
      - /docker/mysql/conf:/etc/mysql/conf.d
      - /etc/localtime:/etc/localtime:ro
    networks:
      ry-net:
        aliases:
          - mysql
    restart: always
    command: [
      'mysqld',
      '--innodb-buffer-pool-size=80M',
      '--character-set-server=utf8mb4',
      '--collation-server=utf8mb4_general_ci',
      '--default-time-zone=+8:00',
      '--lower-case-table-names=1'
    ]

  redis:
    container_name: redis
    restart: always
    image: redis:7.4.0
    ports:
      - "6380:6379"
    volumes:
      - /docker/redis/conf/redis.conf:/etc/redis/redis.conf
      - /docker/redis/data:/data
      - /docker/redis/logs:/logs
    command: redis-server /etc/redis/redis.conf
    networks:
      ry-net:
        aliases:
          - redis

  nginx:
    container_name: nginx
    image: nginx
    restart: always
    ports:
      - "80:80"
    volumes:
      - /usr/local/ruoyi-admin/nginx/data/conf/nginx.conf:/etc/nginx/nginx.conf
      - /usr/local/ruoyi-admin/nginx/data/html/dist:/usr/share/nginx/html
    networks:
      ry-net:
        aliases:
          - nginx
    depends_on:
      - ruoyi-admin

  ruoyi-admin:
    container_name: ruoyi-admin
    restart: always
    build:
      context: ./ry-vue
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    volumes:
      - /usr/local/ruoyi-admin/ry-vue/logs:/app/logs
      - /usr/local/ruoyi-admin/ry-vue/ruoyi-admin.jar:/app/ruoyi-admin.jar
    networks:
      ry-net:
        aliases:
          - ruoyi-admin
    depends_on:
      - mysql
      - redis
    environment:
      - TZ=Asia/Shanghai

networks:
  ry-net:
    external: true
    name: ry-net

然后直接运行

bash 复制代码
docker compose up -d

访问对应的ip:端口

就能看到页面了

相关推荐
天意pt15 小时前
Blog-SSR 系统操作手册(v1.0.0)
前端·vue.js·redis·mysql·docker·node.js·express
清风ai明月16 小时前
在vue3中Promise是什么
vue.js
毕设源码-邱学长16 小时前
【开题答辩全过程】以 基于VUE的打车系统的设计与实现为例,包含答辩的问题和答案
前端·javascript·vue.js
沫离痕16 小时前
windows安装docker实例
windows·docker·容器
麦麦大数据16 小时前
J009 美食推荐可视化大数据系统vue+springboot
vue.js·spring boot·mysql·推荐算法·美食·可视化分析·沙箱支付
rfidunion16 小时前
springboot+VUE+部署(1。新建项目)
java·vue.js·spring boot
Irene199117 小时前
在 Vue 中使用 TypeScript 的几种方式
vue.js·typescript
hhcccchh18 小时前
学习vue第八天 Vue3 模板语法和内置指令 - 简单入门
前端·vue.js·学习
yyf1989052518 小时前
Vue 框架相关中文文献
前端·javascript·vue.js