若依 ruoyi-cloud 微服务 docker compose 部署
首先在Linux服务器(Windows可以装虚拟机或者WLS)安装 docker 和 docker compose,不懂的自行百度。
主要部署流程
-
Clone RuoYi-Cloud 代码到本地。
使用git clone命令从托管平台 Gitee 克隆RuoYi-Cloud代码。 -
修改微服务中 Nacos 的服务注册地址和配置中心地址。
修改 ruoyi-auth、ruoyi-gateway、ruoyi-file、ruoyi-gen、ruoyi-job、ruoyi-system 和 ruoyi-visual 服务中配置文件bootstrap.yml(src\main\resources目录)中配置的注册中心和配置中心默认地址,将127.0.0.1:8848修改为ruoyi-nacos:8848(命名可以自定义,主要是所有配置的要一致) -
打包服务端各个服务为jar
执行 maven 命令mvn clean install,将各个微服务进行打包。
将各个服务打包后的jar包拷贝到 RuoYi-Cloud\docker\ruoyi 对应的各个目录中。(比如:RuoYi-Cloud\ruoyi-auth\target\ruoyi-auth.jar 拷贝到 RuoYi-Cloud\docker\ruoyi\auth 目录,以此类推) -
编译前端项目为静态文件
进入 RuoYi-Cloud\ruoyi-ui,执行命令npm run build:prod,编译前端项目。将编译好的 RuoYi-Cloud\ruoyi-ui\dist目录整体拷贝到RuoYi-Cloud\docker\nginx\html目录。 -
放置数据库脚本到Docker目录
将 RuoYi-Cloud\sql 目录下所有 *.sql文件拷贝到 RuoYi-Cloud\docker\mysql\db 目录。
(这一步可以拷贝,也可以不拷贝然后修改 dockerfile 文件,其实我觉得可以等后续连上 Mysql 用 navicat 自己同步一下数据也没问题)
-
将整个RuoYi-Cloud\docker上传到服务器
将 RuoYi-Cloud\docker 整体上传到服务器 /home/ruoyi-cloud 目录(可以自行定义)。
cd进入服务器 /home/ruoyi/docker 目录,执行chmod +x deploy.sh命令,给deploy.sh脚本赋予执行权限。 -
构建项目中定义的服务容器
执行docker-compose build命令构建服务容器。 -
启动服务
执行./deploy.sh base命令启动基础服务。登录nacos服务,修改各个服务配置中的 redis 和 mysql 连接地址为 docker-compose.yml 定义的相应的服务名称(比如ruoyi-mysql、ruoyi-redis等)。再执行./deploy.sh modules命令启动程序模块。
docker-compose.yml
我这个文件改了我自己的服务、一些需要的中间件和加入健康监测,你们配置不需要全部照抄(配置自己需要的服务即可)。
version: '3.8'
services:
ruoyi-nacos:
container_name: ruoyi-nacos
image: nacos/nacos-server:v2.5.1
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8848/nacos/"]
timeout: 10s
retries: 5
interval: 30s
start_period: 30s
build:
context: ./nacos
environment:
- TZ=Asia/Shanghai
- 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:
condition: service_healthy
networks:
- ruoyi-network
ruoyi-mysql:
container_name: ruoyi-mysql
image: mysql:8.0
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-proot"]
timeout: 20s
retries: 5
interval: 5s
start_period: 30s
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=512M',
'--innodb-log-file-size=128M',
'--max_connections=200',
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci',
'--lower-case-table-names=1'
]
environment:
- MYSQL_DATABASE='ry-cloud'
- MYSQL_ROOT_PASSWORD=root
- MYSQL_ROOT_HOST='%'
- MYSQL_AUTHENTICATION_PLUGIN=mysql_native_password
- TZ=Asia/Shanghai
networks:
- ruoyi-network
ruoyi-redis:
container_name: ruoyi-redis
image: redis
build:
context: ./redis
healthcheck:
test: ["CMD", "redis-cli", "-a", "root", "ping"]
timeout: 10s
retries: 5
interval: 5s
start_period: 30s
ports:
- "6379:6379"
environment:
- TZ=Asia/Shanghai
volumes:
- ./redis/conf/redis.conf:/home/ruoyi/redis/redis.conf
- ./redis/data:/data
command: redis-server /home/ruoyi/redis/redis.conf
networks:
- ruoyi-network
ruoyi-emqx:
container_name: ruoyi-emqx
image: "emqx/emqx:5.3.2"
ports:
- "1883:1883"
- "8083:8083"
- "8084:8084"
- "8883:8883"
- "18083:18083"
environment:
- EMQX_NODE_NAME=emqx@127.0.0.1
- EMQX_NODE__COOKIE=testadmin123
- EMQX_ALLOW_ANONYMOUS=true
- TZ=Asia/Shanghai
volumes:
- ./emqx/log:/opt/emqx/log
- ./emqx/data:/opt/emqx/data
- ./emqx/etc:/opt/emqx/etc
depends_on:
ruoyi-mysql:
condition: service_healthy
networks:
- ruoyi-network
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
environment:
- TZ=Asia/Shanghai
depends_on:
- ruoyi-gateway
networks:
- ruoyi-network
ruoyi-gateway:
container_name: ruoyi-gateway
build:
context: ./ruoyi/gateway
dockerfile: dockerfile
ports:
- "8080:8080"
depends_on:
ruoyi-redis:
condition: service_healthy
ruoyi-nacos:
condition: service_healthy
environment:
- TZ=Asia/Shanghai
networks:
- ruoyi-network
ruoyi-auth:
container_name: ruoyi-auth
build:
context: ./ruoyi/auth
dockerfile: dockerfile
ports:
- "9200:9200"
depends_on:
ruoyi-redis:
condition: service_healthy
ruoyi-nacos:
condition: service_healthy
environment:
- TZ=Asia/Shanghai
networks:
- ruoyi-network
ruoyi-modules-system:
container_name: ruoyi-modules-system
build:
context: ./ruoyi/modules/system
dockerfile: dockerfile
ports:
- "9201:9201"
depends_on:
ruoyi-redis:
condition: service_healthy
ruoyi-mysql:
condition: service_healthy
ruoyi-nacos:
condition: service_healthy
environment:
- TZ=Asia/Shanghai
networks:
- ruoyi-network
ruoyi-modules-iot:
container_name: ruoyi-modules-iot
build:
context: ./ruoyi/modules/iot
dockerfile: dockerfile
ports:
- "9301:9301"
depends_on:
ruoyi-redis:
condition: service_healthy
ruoyi-mysql:
condition: service_healthy
ruoyi-nacos:
condition: service_healthy
environment:
- TZ=Asia/Shanghai
networks:
- ruoyi-network
ruoyi-modules-job:
container_name: ruoyi-modules-job
build:
context: ./ruoyi/modules/job
dockerfile: dockerfile
ports:
- "9203:9203"
depends_on:
ruoyi-redis:
condition: service_healthy
ruoyi-mysql:
condition: service_healthy
ruoyi-nacos:
condition: service_healthy
environment:
- TZ=Asia/Shanghai
networks:
- ruoyi-network
ruoyi-modules-file:
container_name: ruoyi-modules-file
build:
context: ./ruoyi/modules/file
dockerfile: dockerfile
ports:
- "9300:9300"
volumes:
- ./ruoyi/modules/file/uploadPath:/home/ruoyi/uploadPath
depends_on:
ruoyi-nacos:
condition: service_healthy
environment:
- TZ=Asia/Shanghai
networks:
- ruoyi-network
ruoyi-visual-monitor:
container_name: ruoyi-visual-monitor
build:
context: ./ruoyi/visual/monitor
dockerfile: dockerfile
ports:
- "9100:9100"
depends_on:
ruoyi-nacos:
condition: service_healthy
environment:
- TZ=Asia/Shanghai
networks:
- ruoyi-network
networks:
ruoyi-network:
driver: bridge
deploy.sh
启动脚本我改了分批启动,对cpu稍微友好一些(你们也可以按照ruoyi的来)。
#!/bin/sh
# 使用说明,用来提示输入参数
usage() {
echo "Usage: sh 执行脚本.sh [port|base|modules|stop|rm]"
exit 1
}
# 开启所需端口
port(){
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --add-port=8848/tcp --permanent
firewall-cmd --add-port=9848/tcp --permanent
firewall-cmd --add-port=9849/tcp --permanent
firewall-cmd --add-port=6379/tcp --permanent
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --add-port=9100/tcp --permanent
firewall-cmd --add-port=9200/tcp --permanent
firewall-cmd --add-port=9201/tcp --permanent
firewall-cmd --add-port=9202/tcp --permanent
firewall-cmd --add-port=9203/tcp --permanent
firewall-cmd --add-port=9300/tcp --permanent
service firewalld restart
}
# 启动基础环境(必须)
base(){
# docker-compose up -d ruoyi-mysql ruoyi-redis ruoyi-nacos ruoyi-emqx
echo "启动基础环境..."
docker-compose up -d ruoyi-mysql ruoyi-redis
sleep 10
docker-compose up -d ruoyi-nacos ruoyi-emqx
echo "基础环境启动完成,等待服务就绪..."
sleep 10
}
# 启动程序模块(必须)
modules(){
# docker-compose up -d ruoyi-nginx ruoyi-gateway ruoyi-auth ruoyi-modules-system ruoyi-modules-file ruoyi-modules-job ruoyi-modules-iot
echo "=== 开始按顺序启动程序模块 ==="
# 1. 先启动网关(通常是最基础的网关服务)
echo "1. 启动网关服务..."
docker-compose up -d ruoyi-gateway
echo "等待网关服务启动..."
sleep 10
# 2. 启动认证服务
echo "2. 启动认证服务..."
docker-compose up -d ruoyi-auth
echo "等待认证服务启动..."
sleep 10
# 3. 启动系统模块
echo "3. 启动系统模块..."
docker-compose up -d ruoyi-modules-system
echo "等待系统模块启动..."
sleep 10
# 4. 启动文件模块
echo "4. 启动文件模块..."
docker-compose up -d ruoyi-modules-file
echo "等待文件模块启动..."
sleep 5
# 5. 启动定时任务模块
echo "5. 启动定时任务模块..."
docker-compose up -d ruoyi-modules-job
echo "等待定时任务模块启动..."
sleep 5
# 6. 启动物联网模块
echo "6. 启动物联网模块..."
docker-compose up -d ruoyi-modules-iot
echo "等待物联网模块启动..."
sleep 5
# 7. 最后启动Nginx(反向代理)
echo "7. 启动Nginx..."
docker-compose up -d ruoyi-nginx
echo "等待Nginx启动..."
sleep 5
echo "=== 所有程序模块启动完成 ==="
echo "可以使用以下命令查看服务状态:"
echo "docker-compose ps"
}
# 关闭所有环境/模块
stop(){
docker-compose stop
}
# 删除所有环境/模块
rm(){
docker-compose rm
}
# 根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"port")
port
;;
"base")
base
;;
"modules")
modules
;;
"stop")
stop
;;
"rm")
rm
;;
*)
usage
;;
esac
基本要点
- 主要就是要修改路径,因为每个人在Linux中存放路径正常来说不会完全一样,所以要按自己的路径去配置。
- 配置挂载,最好就是用
docker exec -it xxx bash进入镜像,从docker镜像中将原本的镜像复制出来一份,然后再挂载这样即可以实现自定义配置,也不会出现配置不对的情况。类似redis、emqx这些都是这样。 - 镜像安装问题。因为墙的缘故,经常会出现镜像下载不了的问题,可以自己在
/etc/docker/daemon.json配置镜像源(阿里腾讯这两个要用他们的服务器才能用,或者其他的镜像源 轩辕镜像免费版),或者去一些镜像站下载镜像(比如 渡渡鸟镜像同步站 之类的网站) - 端口占用及端口号放行的问题,访问不到也可能是因为端口号的问题,也需要排查。
- 建议刚部署可以不用 depoly 脚本,因为那玩意一下启动太多服务了,可以自己打启动命令单独启动服务
docker compose up -d xxx用docker ps -a看是不是up状态。 如果不是up状态,用docker logs xxx查看日志。 - 如果创建镜像后有改动别忘记重新构建
docker compose build。 - 记得改 Nacos 的连接地址 比如
127.0.0.1:3306改成ruoyi-mysql(这个名字是和你配置对应的)

浙公网安备 33010602011771号