若依 ruoyi-cloud 微服务 docker compose 部署

首先在Linux服务器(Windows可以装虚拟机或者WLS)安装 dockerdocker compose,不懂的自行百度。

主要部署流程

  1. Clone RuoYi-Cloud 代码到本地。
    使用 git clone 命令从托管平台 Gitee 克隆 RuoYi-Cloud代码。

  2. 修改微服务中 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 (命名可以自定义,主要是所有配置的要一致)

  3. 打包服务端各个服务为jar
    执行 maven 命令 mvn clean install,将各个微服务进行打包。
    将各个服务打包后的 jar包 拷贝到 RuoYi-Cloud\docker\ruoyi 对应的各个目录中。(比如:RuoYi-Cloud\ruoyi-auth\target\ruoyi-auth.jar 拷贝到 RuoYi-Cloud\docker\ruoyi\auth 目录,以此类推)

  4. 编译前端项目为静态文件
    进入 RuoYi-Cloud\ruoyi-ui,执行命令 npm run build:prod,编译前端项目。将编译好的 RuoYi-Cloud\ruoyi-ui\dist目录整体拷贝到RuoYi-Cloud\docker\nginx\html目录。

  5. 放置数据库脚本到Docker目录

将 RuoYi-Cloud\sql 目录下所有 *.sql文件拷贝到 RuoYi-Cloud\docker\mysql\db 目录。

(这一步可以拷贝,也可以不拷贝然后修改 dockerfile 文件,其实我觉得可以等后续连上 Mysql 用 navicat 自己同步一下数据也没问题)

  1. 将整个RuoYi-Cloud\docker上传到服务器
    将 RuoYi-Cloud\docker 整体上传到服务器 /home/ruoyi-cloud 目录(可以自行定义)。
    cd进入服务器 /home/ruoyi/docker 目录,执行 chmod +x deploy.sh 命令,给deploy.sh脚本赋予执行权限。

  2. 构建项目中定义的服务容器
    执行 docker-compose build 命令构建服务容器。

  3. 启动服务
    执行 ./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

基本要点

  1. 主要就是要修改路径,因为每个人在Linux中存放路径正常来说不会完全一样,所以要按自己的路径去配置。
  2. 配置挂载,最好就是用 docker exec -it xxx bash 进入镜像,从docker镜像中将原本的镜像复制出来一份,然后再挂载这样即可以实现自定义配置,也不会出现配置不对的情况。类似redis、emqx这些都是这样。
  3. 镜像安装问题。因为墙的缘故,经常会出现镜像下载不了的问题,可以自己在 /etc/docker/daemon.json 配置镜像源(阿里腾讯这两个要用他们的服务器才能用,或者其他的镜像源 轩辕镜像免费版),或者去一些镜像站下载镜像(比如 渡渡鸟镜像同步站 之类的网站)
  4. 端口占用及端口号放行的问题,访问不到也可能是因为端口号的问题,也需要排查。
  5. 建议刚部署可以不用 depoly 脚本,因为那玩意一下启动太多服务了,可以自己打启动命令单独启动服务 docker compose up -d xxxdocker ps -a 看是不是 up 状态。 如果不是 up 状态,用 docker logs xxx 查看日志。
  6. 如果创建镜像后有改动别忘记重新构建 docker compose build
  7. 记得改 Nacos 的连接地址 比如 127.0.0.1:3306 改成 ruoyi-mysql (这个名字是和你配置对应的)
posted @ 2025-08-12 08:30  启航黑珍珠号  阅读(959)  评论(0)    收藏  举报