在ARM平台上使用docker部署Rouyi-Cloud
概述
- 使用mac pro的m2芯片,启动ubuntu虚机,运行docker环境,该硬件环境是ARM平台
- 使用docker环境,通过docker compose,将ruoyi-cloud项目运行并配置起来
资源列表
- 修改后源码地址:https://gitee.com/jdragonhu/RuoYi-Cloud 分支:docker-arm
- 源代码:https://gitee.com/y_project/RuoYi-Cloud/
- 使用版本:v3.6.3,截止2023-0830
- 在docker目录下,有docker-compose的运行方案,需要修改配置才能够适配arm环境和容器
- 文档地址:http://doc.ruoyi.vip/ruoyi-cloud/
- 变更的源码:https://gitee.com/jdragonhu/RuoYi-Cloud/commit/e232c5a99a65ac4da48c80ebf71cdde4506dd5f5
后端框架和版本
- Java EE 8
- Spring Boot 2.3.x
- Spring Cloud Hoxton.SR9
- Spring Framework 5.2.x
- Vue 2.6.x
- Element 2.14.x
运行环境必备
- JDK >= 1.8 (推荐1.8版本)
- Mysql >= 5.7.0 (推荐5.7版本)
- Redis >= 3.0
- Maven >= 3.0
- Node >= 12
- nacos >= 2.x.x
- sentinel >= 1.6.0
下载ruoyi-cloud源代码
- mkdir project && cd project
- git clone https://gitee.com/y_project/RuoYi-Cloud.git
准备ARM上适配的软件
- 在mac上,安装并使用multipass,管理ubuntu虚机
- https://multipass.run/install
- 选择并下载mac安装包
- 启动一个ubuntu虚机
- multipass launch docker
- 注意:multipass launch docker,并不能拉起带docker的ubuntu,而是启动一个原生的ubuntu
- 可能是docker适配的ubuntu,没有arm环境适配的镜像
- 在ubuntu上,调整system-resovled的DNS服务器配置,以避免DNS寻址问题
- 在/etc/systemd/resovled.conf中,增加DNS地址
- sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
- 重启 sudo systemctl restart systemd-resolved
- 在ubuntu上,更新APT对应的ARM环境仓库地址,很重要
- deb http://mirrors.aliyun.com/ubuntu-ports/ jammy main restricted universe multiverse
- 主要是使用ports仓库,ports仓库中包含了ARM适配的软件包
- 可以百度下如何更新arm适配的sources.list文件
- 在ubuntu上,安装并配置docker
- sudo apt install docker-ce
sudo usermod -aG docker $USER
- 退出shell并重新进入
- docker version
- 在ubuntu上,安装并配置openjdk
- sudo apt install openjdk-18-jdk
- java --version
- 在ubuntu上,安装并配置maven
- sudo apt install maven
- 在ubuntu上,安装并配置nvm,以管理nodejs的安装
- curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
- 在ubuntu,安装并配置nodejs v12版本
- nvm install 12
- node -v
编译ruoyi-cloud
- cd RuoYi-Cloud
- 编译java服务器代码
- mvn package
- 先要安装好maven
- 注意:pom.xml,已经设置仓库为maven.aliyun.com了
- 网络畅通的前提下,全部jar包编译完大约不到5分钟
- mvn package
- 打包ruoyi-ui客户端代码
- cd ruoyi-ui
- 注意:先要安装好nodejs,使用版本12即可
- npm install --registry=https://registry.npmmirror.com
- npm run build:prod
准备工作,将jar包和sql文件复制到docker下
- cd ../docker
- sh copy.sh
- 注意,sql文件可能有文件名不对问题,请自行调整sql文件名
docker镜像的arm版本问题
- 按照以下方案,修改docker-compose.yaml文件的相关镜像和版本
- redis不用修改,自带了arm版本
- mysql:5.7,换为:biarms/mysql:5.7
- 使用以下命令查看某个镜像的平台支持
- docker run --rm mplatform/mquery biarms/mysql:5.7
- nacos/nacos-server 换为:nacos/nacos-server:v2.2.3-slim
- sh deploy.sh base
- 确保mysql已经正常起来
启动base相关服务
- sh deploy.sh base
- 会启动三个服务
- redis
- mysql
- nacos
- 确保mysql和redis都起来了
- docker compose ps
- 注意:nacos会起不来,因为
- nacos需要调整为arm版本
- db中没有配置ry-config数据库
初始化mysql数据库
- 可以通过 mysql:{ubuntu-ip}:3306,访问mysql服务
- mysql登录账号缺省是:root/password
- 使用mysql-client,创建db并导入数据(自行使用合适的客户端工具)
- ry-config:导入 RuoYi-Cloud/docker/mysql/db/ry_config_20220929.sql 文件
- ry-cloud:导入 RuoYi-Cloud/docker/mysql/db/ry_20230706.sql
- 最终有2个db
- ry-cloud
- ry-config
重新启动nacos
- nacos/nacos-server 换为:nacos/nacos-server:v2.2.3-slim
- 检测平台支持:docker run --rm mplatform/mquery nacos/nacos-server:v2.2.3-slim
- sh deploy.sh base
- 确保redis,mysql,nacos已经正常启动
- 可以通过 http://{ubuntu-ip}:8848/nacos 访问nacos管理界面,缺省没有密码
- 可以通过 mysql:{ubuntu-ip}:3306,访问mysql服务
启动modules相关微服务
- sh deploy.sh modules
- 会启动多个微服务
- ruoyi-nginx,该服务会承载前端静态ui,并会将prod-api的路径转发给后端gateway
- ruoyi-gateway
- ruoyi-auth
- ruoyi-modules-system
- 注意:后面3个java版本的服务,都会起不来,需要修改配置文件
调整ruoyi-gateway的配置文件
- 通过环境变量,注入nacos的服务器地址
- 缺省的nacos地址,配置为 127.0.0.1:8848,由于是容器环境隔离了,该ip地址是错误的
- SPRING_CLOUD_NACOS_DISCOVERY_SERVERADDR
- 修改docker-compose.yaml,调整gateway的环境变量为
environment: SPRING_CLOUD_NACOS_DISCOVERY_SERVERADDR: ruoyi-nacos:8848 SPRING_CLOUD_NACOS_CONFIG_SERVERADDR: ruoyi-nacos:8848
- 登录到nacos,修改nacos配种中心上的,ruoyi-gateway-dev.yml中的redis服务器地址为
ruoyi-redis
- 注意spring_redis_host参数,不能通过环境变量设置
- 因为该参数是app启动之后,从nacos的配置中心后面注入的,会以nacos为准
- 注意spring_redis_host参数,不能通过环境变量设置
- 重启gateway
- docker compose restart ruoyi-gateway
- 需要的话,重启ruoyi-nginx
- docker compose restart ruoyi-nginx
- 由于nginx会记住后端proxypass后端的gateway的ip地址,当gateway重启后,ip地址可能会变更
一些docker compose的调试命令
- docker compose ps
- docker compose logs -f
- docker compose logs xxx -f
- docker compose restart xxx
调整ruoyi-auth的配置文件
- 通过环境变量,注入nacos的注册中心和配置中心地址
- 修改docker-compose.yaml,调整ruoyi-auth的环境变量为
environment: SPRING_CLOUD_NACOS_DISCOVERY_SERVERADDR: ruoyi-nacos:8848 SPRING_CLOUD_NACOS_CONFIG_SERVERADDR: ruoyi-nacos:8848
- 修改nacos上配置中心的配置文件ruoyi-auth-dev.yml
- 调整spring.redis.host的地址为
ruoyi-test
- 调整spring.redis.host的地址为
- 重启ruoyi-auth
- docker compose restart ruoyi-auth
调整ruoyi-modules-system的配置文件
- 通过环境变量,注入nacos的注册中心和配置中心地址
- 修改docker-compose.yaml,调整ruoyi-modules-system的环境变量为
environment: SPRING_CLOUD_NACOS_DISCOVERY_SERVERADDR: ruoyi-nacos:8848 SPRING_CLOUD_NACOS_CONFIG_SERVERADDR: ruoyi-nacos:8848
- 修改nacos上配置中心的配置文件ruoyi-system-dev.yml
- 调整spring.redis.host的地址为
ruoyi-test
- 调整spring.datasource.dynamic.datasource.master.url中的MySQL服务器地址为
ruoyi-mysql
- 调整spring.redis.host的地址为
- 重启ruoyi-modules-system
- docker compose restart ruoyi-modules-system
确保所有服务启动正常
- docker compose ps
- 应该能够看到7个容器实例
-
docker compose logs
访问ruoyi首页并登录
- 前端ui的地址,通过容器ruoyi-nginx公布出来,端口80,并绑定到host主机的80端口
- 打开浏览器,访问:http://{ubuntu-ip}/
- 输入账号:admin 密码:admin123 并输入
验证码
- 该账号和密码,存放在mysql的数据库ruoyi-cloud,表sys_user中
- 由ry_20230706.sql导入时候生成该账号和密码
- 进入到系统首页,登录成功
- 点击展开左侧
系统管理
菜单,依次点击并体验功能- 用户管理
- 角色管理
- 菜单管理
- 部门管理
- 通知公告
- 可以新增一个通知,正常存盘并显示
-
以上功能都展示正常
后续
- 当前的docker部署,只部署了部分微服务和中间件
- 部署的中间件
- redis
- myql
- nacos
- 部署的微服务
- ruoyi-nginx
- ruoyi-gateway
- ruoyi-auth
- ruoyi-modules-system
- 当前并没有启动的微服务
- ruoyi-modeuls-gen
- ruoyi-modules-job
- ruoyi-modules-file
- ruoyi-visual-monitor
- 以上的微服务可以按需启动
- docker compose up -d ruoyi-modules-job
- 你自己开发的微服务,可以定义在docker-compose.yaml文件中,并按需启动
- docker compose up -d xxxx
- 注意,如果你自己开发的微服务需要和docker中的其他中间件和微服务联调,请使用各个容器公开出来的host端口地址
- 注意:host端口地址,不是docker-compose.yaml文件中定义的service名字
最后,给出调整后的docker-compose.yaml文件
version : '3.8'
services:
ruoyi-nacos:
container_name: ruoyi-nacos
image: nacos/nacos-server:v2.2.3-slim
build:
context: ./nacos
environment:
- MODE=standalone
volumes:
- ./nacos/logs/:/home/nacos/logs
- ./nacos/conf/application.properties:/home/nacos/conf/application.properties
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
depends_on:
- ruoyi-mysql
ruoyi-mysql:
container_name: ruoyi-mysql
image: biarms/mysql:5.7
build:
context: ./mysql
ports:
- "3306:3306"
volumes:
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/logs:/logs
- ./mysql/data:/var/lib/mysql
command: [
'mysqld',
'--innodb-buffer-pool-size=80M',
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci',
'--default-time-zone=+8:00',
'--lower-case-table-names=1'
]
environment:
MYSQL_DATABASE: 'ry-cloud'
MYSQL_ROOT_PASSWORD: password
ruoyi-redis:
container_name: ruoyi-redis
image: redis
build:
context: ./redis
ports:
- "6379:6379"
volumes:
- ./redis/conf/redis.conf:/home/ruoyi/redis/redis.conf
- ./redis/data:/data
command: redis-server /home/ruoyi/redis/redis.conf
ruoyi-nginx:
container_name: ruoyi-nginx
image: nginx
build:
context: ./nginx
ports:
- "80:80"
volumes:
- ./nginx/html/dist:/home/ruoyi/projects/ruoyi-ui
- ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/logs:/var/log/nginx
- ./nginx/conf.d:/etc/nginx/conf.d
depends_on:
- ruoyi-gateway
links:
- ruoyi-gateway
ruoyi-gateway:
container_name: ruoyi-gateway
build:
context: ./ruoyi/gateway
dockerfile: dockerfile
ports:
- "8080:8080"
environment:
SPRING_CLOUD_NACOS_DISCOVERY_SERVERADDR: ruoyi-nacos:8848
SPRING_CLOUD_NACOS_CONFIG_SERVERADDR: ruoyi-nacos:8848
depends_on:
- ruoyi-redis
links:
- ruoyi-redis
ruoyi-auth:
container_name: ruoyi-auth
build:
context: ./ruoyi/auth
dockerfile: dockerfile
ports:
- "9200:9200"
environment:
SPRING_CLOUD_NACOS_DISCOVERY_SERVERADDR: ruoyi-nacos:8848
SPRING_CLOUD_NACOS_CONFIG_SERVERADDR: ruoyi-nacos:8848
depends_on:
- ruoyi-redis
links:
- ruoyi-redis
ruoyi-modules-system:
container_name: ruoyi-modules-system
build:
context: ./ruoyi/modules/system
dockerfile: dockerfile
ports:
- "9201:9201"
environment:
SPRING_CLOUD_NACOS_DISCOVERY_SERVERADDR: ruoyi-nacos:8848
SPRING_CLOUD_NACOS_CONFIG_SERVERADDR: ruoyi-nacos:8848
depends_on:
- ruoyi-redis
- ruoyi-mysql
links:
- ruoyi-redis
- ruoyi-mysql
ruoyi-modules-gen:
container_name: ruoyi-modules-gen
build:
context: ./ruoyi/modules/gen
dockerfile: dockerfile
ports:
- "9202:9202"
environment:
SPRING_CLOUD_NACOS_DISCOVERY_SERVERADDR: ruoyi-nacos:8848
SPRING_CLOUD_NACOS_CONFIG_SERVERADDR: ruoyi-nacos:8848
depends_on:
- ruoyi-mysql
links:
- ruoyi-mysql
ruoyi-modules-job:
container_name: ruoyi-modules-job
build:
context: ./ruoyi/modules/job
dockerfile: dockerfile
ports:
- "9203:9203"
environment:
SPRING_CLOUD_NACOS_DISCOVERY_SERVERADDR: ruoyi-nacos:8848
SPRING_CLOUD_NACOS_CONFIG_SERVERADDR: ruoyi-nacos:8848
depends_on:
- ruoyi-mysql
links:
- ruoyi-mysql
ruoyi-modules-file:
container_name: ruoyi-modules-file
build:
context: ./ruoyi/modules/file
dockerfile: dockerfile
ports:
- "9300:9300"
environment:
SPRING_CLOUD_NACOS_DISCOVERY_SERVERADDR: ruoyi-nacos:8848
SPRING_CLOUD_NACOS_CONFIG_SERVERADDR: ruoyi-nacos:8848
volumes:
- ./ruoyi/uploadPath:/home/ruoyi/uploadPath
ruoyi-visual-monitor:
container_name: ruoyi-visual-monitor
build:
context: ./ruoyi/visual/monitor
dockerfile: dockerfile
ports:
- "9100:9100"
environment:
SPRING_CLOUD_NACOS_DISCOVERY_SERVERADDR: ruoyi-nacos:8848
SPRING_CLOUD_NACOS_CONFIG_SERVERADDR: ruoyi-nacos:8848