写在最前

  1. 使用docker部署若依这个过程会使用到jenkins流水线以及一些其他的附属调试,在此我建议先过一遍前置条件再来操作本篇章。

  2. 值得一提的是,我提供的若依gitee代码已经为你写了一份比较好的Dockerfile了,它在每个服务的目录里面,详细你可以拉取代码看看。

https://gitee.com/tanqidi/RuoYi-Cloud_1/tree/tanqidi_v3.6.4/

  1. 可以看到我给出的Dockerfile中的nacos注册中心和配置中心都指定为dev所以nacos就必须要创建这个namespace,将default中的配置文件给克隆过去。

图片-okrn.png

# 基础容器
FROM registry.cn-hangzhou.aliyuncs.com/tanqidi/openjdk:17-jdk
# 作者
LABEL maintainer=tanqidi

# java参数
ENV JAVA_PARAMS=""
# jvm虚拟机参数
ENV JAVA_OPS="-Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom"
# spring激活文件
ENV PROFILES_ACTIVE="dev"
# nacos配置中心名称空间
ENV NACOS_CONFIG_NAMESPACE="dev"
# nacos服务发现名称空间
ENV NACOS_DISCOVERY_NAMESPACE="dev"
# nacos注册中心
ENV NACOS_DISCOVERY_SERVER_ADDR="app-nacos1.basic.tanqidi.com:8848"
# nacos配置中心
ENV NACOS_CONFIG_SERVER_ADDR="app-nacos1.basic.tanqidi.com:8848"
# nacos文件后缀
ENV NACOS_CONFIG_FILE_EXTENSION="yml"

# 时区配置
RUN echo 'Asia/Shanghai' > /etc/timezone

# 业务jar包
COPY target/*.jar /app/app.jar

# 暴露端口
EXPOSE 8080

ENTRYPOINT ["/bin/sh", "-c", "java ${JAVA_OPS} -jar /app/app.jar \
--server.port=8080 \
--spring.profiles.active=${PROFILES_ACTIVE} \
--spring.cloud.nacos.config.namespace=${NACOS_CONFIG_NAMESPACE} \
--spring.cloud.nacos.discovery.server-addr=${NACOS_DISCOVERY_SERVER_ADDR} \
--spring.cloud.nacos.discovery.namespace=${NACOS_DISCOVERY_NAMESPACE} \
--spring.cloud.nacos.config.server-addr=${NACOS_CONFIG_SERVER_ADDR} \
--spring.cloud.nacos.config.file-extension=${NACOS_CONFIG_FILE_EXTENSION} \
${JAVA_PARAMS}"]

图片-vpeq.png

图片-bmlj.png

图片-tcsv.png

1. 前置条件

  1. Jenkins:从配置到部署全面指南

  2. 若依管理系统:本地调试启动

2. 部署流程

2.1 ruoyi-auth

因为上一篇章我们已经通过devops-java-sample项目试验完构建与部署了,因为流程都是一样的这里我只演示一个。

图片-rvhr.png

2.1.1 限制项目的运行节点

图片-xnoj.png

2.1.2 源码管理

图片-yjbl.png

2.1.3 构建环境

图片-ypcn.png

2.1.4 Build Steps:执行 shell

# 使用build-maven3.6当前环境的mvn构建java源码
mvn clean package -Dmaven.test.failure.ignore=true -DskipTests=true -U
# 进入到ruoyi-auth目录
cd ./ruoyi-auth
# 构建完成后当前目录会多一个target目录,里面就是最终具体的可运行jar包了
ls -l target

# 因为代码中的Dockerfile写死是8080,所以我们使用sed来替换端口
sed -i 's/8080/9200/g' ./Dockerfile

2.1.5 Docker Build and Publish

在使用Docker部署若依(Ruoyi)这样的多模块项目时,我们确实需要进行一些特别的配置,因为若依的代码结构包含了多个子模块,而Docker默认会在项目的根目录寻找Dockerfile。由于Dockerfile位于ruoyi-auth模块目录下,我们需要对Docker的构建过程进行一些定制,以确保它能够在正确的位置找到并使用这个Dockerfile

图片-ijpz.png

2.1.6 Trigger parameterized build on other projects

复制粘贴替换内容即可,改完点击构建吧。

deploy_node_name=build-maven3.6
application_name=ruoyi-auth
container_name=ruoyi-auth
image_name=tanqidi-temp/ruoyi-auth
tag_name=dev_latest

2.2 ruoyi-gateway

剩下的模块我就不一一列举了,只粘贴关键的内容与描述。

2.2.1 Build Steps:执行 shell

# 使用build-maven3.6当前环境的mvn构建java源码
mvn clean package -Dmaven.test.failure.ignore=true -DskipTests=true -U
# 进入到ruoyi-auth目录
cd ./ruoyi-auth
# 构建完成后当前目录会多一个target目录,里面就是最终具体的可运行jar包了
ls -l target

# 因为gateway模块本身就是8080,默认Dockerfile端口就是8080,这样就不用替换端口了。
# sed -i 's/8080/9200/g' ./Dockerfile

2.2.2 Docker Build and Publish

和上面一样的,点高级改动Repository NameBuild Context 即可。

2.2.3 Trigger parameterized build on other projects

复制粘贴替换内容即可,改完点击构建吧。

deploy_node_name=build-maven3.6
application_name=ruoyi-gateway
container_name=ruoyi-gateway
image_name=tanqidi-temp/ruoyi-gateway
tag_name=dev_latest

2.3 ruoyi-file

2.3.1 Build Steps:执行 shell

# 使用build-maven3.6当前环境的mvn构建java源码
mvn clean package -Dmaven.test.failure.ignore=true -DskipTests=true -U
# 进入到ruoyi-file目录
cd ./ruoyi-modules/ruoyi-file
# 构建完成后当前目录会多一个target目录,里面就是最终具体的可运行jar包了
ls -l target

# 因为代码中的Dockerfile写死是8080,所以我们使用sed来替换端口
sed -i 's/8080/9300/g' ./Dockerfile

2.3.2 Docker Build and Publish

和上面一样的,点高级改动Repository NameBuild Context 即可,注意Build Context需要加上 ./ruoyi-modules/ 路径

2.3.3 Trigger parameterized build on other projects

deploy_node_name=build-maven3.6
application_name=ruoyi-file
container_name=ruoyi-file
image_name=tanqidi-temp/ruoyi-file
tag_name=dev_latest

2.4 ruoyi-gen

2.4.1 Build Steps:执行 shell

# 使用build-maven3.6当前环境的mvn构建java源码
mvn clean package -Dmaven.test.failure.ignore=true -DskipTests=true -U
# 进入到ruoyi-gen目录
cd ./ruoyi-modules/ruoyi-gen
# 构建完成后当前目录会多一个target目录,里面就是最终具体的可运行jar包了
ls -l target

# 因为代码中的Dockerfile写死是8080,所以我们使用sed来替换端口
sed -i 's/8080/9202/g' ./Dockerfile

2.4.2 Docker Build and Publish

和上面一样的,点高级改动Repository NameBuild Context 即可,注意Build Context需要加上 ./ruoyi-modules/ 路径

2.4.3 Trigger parameterized build on other projects

deploy_node_name=build-maven3.6
application_name=ruoyi-gen
container_name=ruoyi-gen
image_name=tanqidi-temp/ruoyi-gen
tag_name=dev_latest

2.5 ruoyi-job

2.5.1 Build Steps:执行 shell

# 使用build-maven3.6当前环境的mvn构建java源码
mvn clean package -Dmaven.test.failure.ignore=true -DskipTests=true -U
# 进入到ruoyi-job目录
cd ./ruoyi-modules/ruoyi-job
# 构建完成后当前目录会多一个target目录,里面就是最终具体的可运行jar包了
ls -l target

# 因为代码中的Dockerfile写死是8080,所以我们使用sed来替换端口
sed -i 's/8080/9203/g' ./Dockerfile

2.5.2 Docker Build and Publish

和上面一样的,点高级改动Repository NameBuild Context 即可,注意Build Context需要加上 ./ruoyi-modules/ 路径

2.5.3 Trigger parameterized build on other projects

deploy_node_name=build-maven3.6
application_name=ruoyi-job
container_name=ruoyi-job
image_name=tanqidi-temp/ruoyi-job
tag_name=dev_latest

2.6 ruoyi-system

2.6.1 Build Steps:执行 shell

# 使用build-maven3.6当前环境的mvn构建java源码
mvn clean package -Dmaven.test.failure.ignore=true -DskipTests=true -U
# 进入到ruoyi-system目录
cd ./ruoyi-modules/ruoyi-system
# 构建完成后当前目录会多一个target目录,里面就是最终具体的可运行jar包了
ls -l target

# 因为代码中的Dockerfile写死是8080,所以我们使用sed来替换端口
sed -i 's/8080/9201/g' ./Dockerfile

2.6.2 Docker Build and Publish

和上面一样的,点高级改动Repository NameBuild Context 即可,注意Build Context需要加上 ./ruoyi-modules/ 路径

2.6.3 Trigger parameterized build on other projects

deploy_node_name=build-maven3.6
application_name=ruoyi-system
container_name=ruoyi-system
image_name=tanqidi-temp/ruoyi-system
tag_name=dev_latest

2.7 ruoyi-monitor

2.7.1 Build Steps:执行 shell

# 使用build-maven3.6当前环境的mvn构建java源码
mvn clean package -Dmaven.test.failure.ignore=true -DskipTests=true -U
# 进入ruoyi-monitor目录
cd ./ruoyi-visual/ruoyi-monitor
# 构建完成后当前目录会多一个target目录,里面就是最终具体的可运行jar包了
ls -l target

# 因为代码中的Dockerfile写死是8080,所以我们使用sed来替换端口
sed -i 's/8080/9100/g' ./Dockerfile

2.7.2 Docker Build and Publish

和上面一样的,点高级改动Repository NameBuild Context 即可,注意Build Context需要加上 ./ruoyi-visual/ 路径

2.7.3 Trigger parameterized build on other projects

deploy_node_name=build-maven3.6
application_name=ruoyi-monitor
container_name=ruoyi-monitor
image_name=tanqidi-temp/ruoyi-monitor
tag_name=dev_latest

2.8 ruoyi-ui

请按前置条件新增加slave构建节点:build-nodejs-nvm,镜像:registry.cn-hangzhou.aliyuncs.com/tanqidi/jnlp-slave-nvm:inbound-agent-3107.v665000b_51092-15-jdk17

2.8.1 前置条件

  1. Jenkins:jenkins-slave-nodejs18 & nvm

2.8.2 限制项目的运行节点

图片-iodf.png

2.8.3 1panel 域名配置

由于当前所有的若依容器(特别是 ruoyi-ui 容器)都通过 deploy-app 任务部署在 172.31.0.123 节点上,因此将 1Panel 解析至该节点的 80 端口,即可通过 ruoyi-ui 容器返回并访问页面。

  1. 主域名:ruoyi.dev.tanqidi.com

  2. 代理地址:172.31.0.123:80

2.8.4 dnsmasq 域名解析

# 若依后端服务域名,前端的 nginx.conf 配置中会用到该域名进行反向代理
address=/ruoyi-gateway.basic.tanqidi.com/172.31.0.123

# 若依前端浏览器访问域名,解析至 1Panel 节点,由 1Panel 反向代理到 172.31.0.123:80 并返回前端页面
address=/ruoyi.dev.tanqidi.com/172.31.0.100

2.8.5 Build Steps:执行 shell

# 执行初始化脚本
set +x
. ~/.nvm/nvm.sh
. ~/.profile
. ~/.bashrc

# nvm 命令可以列表已经安装好的的版本
nvm list
# 使用nodejs14
nvm use 14

# 进入到ruoyi-ui项目
cd ./ruoyi-ui

# 构建前端, 并打印详细日志
npm install --registry=https://registry.npmmirror.com --verbose
npm run build:prod

2.8.6 Docker Build and Publish

和上面一样的,点高级改动Repository NameBuild Context 即可,ruoyi-ui项目的Build Context是./ruoyi-ui,只有一级目录

2.8.7 Trigger parameterized build on other projects

deploy_node_name=build-nodejs-nvm
application_name=ruoyi-ui
container_name=ruoyi-ui
image_name=tanqidi-temp/ruoyi-ui
tag_name=dev_latest

3. 结果演示

可以看到所有流水线都构建通过并部署在172.31.0.123节点上,而且也顺利注册进nacos,使用域名访问也完全正常!

图片-jihv.png

图片-vedb.png

图片-nltx.png

图片-smul.png

4. 操作总结

本章节看似很多实则几乎都是重复的,可能会让你出错的地方就是nacos你没有创建namespace克隆配置文件进去,导致流水线部署容器的时候出现异常。