使用Docke部署若依项目

使用Docker + Docker Compose部署若依(RuoYi)Java单体应用

本文将详细介绍如何使用Docker + Docker Compose部署若依单体应用,实现开箱即用的容器化部署方案。

1. 环境准备

1.1 系统要求

  • 操作系统:Linux/Windows/macOS
  • 内存:至少4GB
  • 磁盘空间:至少10GB

1.2 Docker安装

Ubuntu/Debian系统:

# 更新包索引
sudo apt update

# 安装Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker

# 验证安装
docker --version

CentOS/RHEL系统:

# 安装Docker
sudo yum install -y docker

# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker

Windows系统:
下载Docker Desktop for Windows并按提示安装。

1.3 Docker Compose安装

# 下载Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version

2. 项目准备

2.1 获取若依源码

# 克隆若依项目
git clone https://gitee.com/y_project/RuoYi.git
cd RuoYi

2.2 修改应用配置

修改src/main/resources/application-druid.yml数据库配置:

# 数据源配置
spring:
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            # 主库数据源
            master:
                url: jdbc:mysql://mysql:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                username: root
                password: 123456

修改src/main/resources/application.yml Redis配置:

# redis 配置
redis:
    # 地址
    host: redis
    # 端口,默认为6379
    port: 6379
    # 数据库索引
    database: 0
    # 密码
    password: 
    # 连接超时时间
    timeout: 10s

2.3 创建Dockerfile

在项目根目录创建Dockerfile

# 使用OpenJDK 8作为基础镜像
FROM openjdk:8-jre-alpine

# 设置维护者信息
LABEL maintainer="ruoyi@example.com"

# 设置时区
RUN apk add --no-cache tzdata && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone

# 创建应用目录
WORKDIR /app

# 复制jar包到容器
COPY target/ruoyi-admin.jar app.jar

# 暴露端口
EXPOSE 8080

# 设置JVM参数
ENV JAVA_OPTS="-Xmx512m -Xms512m"

# 启动应用
ENTRYPOINT exec java $JAVA_OPTS -jar app.jar

2.4 Maven打包配置

修改pom.xml,确保打包插件配置正确:

<build>
    <finalName>ruoyi-admin</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.5.15</version>
            <configuration>
                <fork>true</fork>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

3. 中间件配置

3.1 MySQL初始化脚本

创建docker/mysql/init目录,并将若依的SQL初始化文件复制到该目录:

mkdir -p docker/mysql/init
cp sql/quartz.sql docker/mysql/init/
cp sql/ry_20231130.sql docker/mysql/init/

3.2 MySQL配置文件

创建docker/mysql/conf/my.cnf

[mysqld]
# 基础配置
default-storage-engine=INNODB
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
explicit_defaults_for_timestamp=true
lower_case_table_names=1

# 性能优化
max_connections=200
max_connect_errors=6000
open_files_limit=65535
table_open_cache=128
max_allowed_packet=4M
binlog_cache_size=1M
max_heap_table_size=8M
tmp_table_size=16M

# 日志配置
log-error=/var/log/mysql/error.log
slow_query_log=1
long_query_time=1
slow_query_log_file=/var/log/mysql/slow.log

[mysql]
default-character-set=utf8mb4

[client]
port=3306
default-character-set=utf8mb4

3.3 Redis配置文件

创建docker/redis/redis.conf

# 网络配置
bind 0.0.0.0
port 6379
timeout 300

# 通用配置
daemonize no
loglevel notice
databases 16

# 内存管理
maxmemory 256mb
maxmemory-policy allkeys-lru

# 持久化配置
save 900 1
save 300 10
save 60 10000
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb

# AOF配置
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec

4. Docker Compose编排

创建docker-compose.yml文件:

version: '3.8'

services:
  # MySQL数据库
  mysql:
    image: mysql:8.0
    container_name: ruoyi-mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: ry
      MYSQL_USER: ruoyi
      MYSQL_PASSWORD: 123456
      TZ: Asia/Shanghai
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./docker/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/mysql/init:/docker-entrypoint-initdb.d
      - mysql_logs:/var/log/mysql
    command: --default-authentication-plugin=mysql_native_password
    networks:
      - ruoyi-network

  # Redis缓存
  redis:
    image: redis:7-alpine
    container_name: ruoyi-redis
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
      - ./docker/redis/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    networks:
      - ruoyi-network

  # 若依应用
  ruoyi-app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: ruoyi-app
    restart: always
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=druid
      - TZ=Asia/Shanghai
    volumes:
      - app_logs:/app/logs
      - app_upload:/app/upload
    depends_on:
      - mysql
      - redis
    networks:
      - ruoyi-network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
      interval: 30s
      timeout: 10s
      retries: 3

# 网络配置
networks:
  ruoyi-network:
    driver: bridge

# 数据卷配置
volumes:
  mysql_data:
    driver: local
  mysql_logs:
    driver: local
  redis_data:
    driver: local
  app_logs:
    driver: local
  app_upload:
    driver: local

5. 部署步骤

5.1 项目编译打包

# 清理并打包项目
mvn clean package -DskipTests

# 验证jar包生成
ls -la target/ruoyi-admin.jar

5.2 启动服务

# 构建并启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看服务日志
docker-compose logs -f ruoyi-app

5.3 验证部署

# 检查容器状态
docker ps

# 检查网络连通性
docker exec ruoyi-app ping mysql
docker exec ruoyi-app ping redis

# 访问应用
curl http://localhost:8080

# 检查数据库连接
docker exec -it ruoyi-mysql mysql -uroot -p123456 -e "show databases;"

5.4 访问系统

打开浏览器访问:http://localhost:8080

默认账号密码:

  • 管理员:admin/admin123
  • 普通用户:ry/admin123

6. 常见问题与解决方案

6.1 容器启动失败

问题:MySQL容器启动失败

# 查看详细错误日志
docker-compose logs mysql

# 常见原因:端口被占用
sudo netstat -tlnp | grep 3306

解决方案:

# 修改端口映射
ports:
  - "3307:3306"  # 使用3307端口

6.2 数据库连接失败

问题:应用无法连接数据库

# 检查网络连通性
docker exec ruoyi-app ping mysql

解决方案:

# 确保depends_on配置正确
depends_on:
  - mysql
  - redis

6.3 内存不足

问题:容器因内存不足被杀死

# 查看系统资源使用
docker stats

# 查看容器退出原因
docker inspect ruoyi-app | grep -A 5 -B 5 ExitCode

解决方案:

# 限制容器内存使用
deploy:
  resources:
    limits:
      memory: 1G
    reservations:
      memory: 512M

6.4 性能优化建议

JVM优化:

ENV JAVA_OPTS="-Xmx1g -Xms1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"

MySQL优化:

# 调整缓冲池大小
innodb_buffer_pool_size=512M
innodb_buffer_pool_instances=2

Redis优化:

# 调整最大内存
maxmemory 512mb
maxmemory-policy allkeys-lru

6.5 数据备份

# 数据库备份
docker exec ruoyi-mysql mysqldump -uroot -p123456 ry > backup.sql

# Redis备份
docker exec ruoyi-redis redis-cli BGSAVE

# 文件上传目录备份
docker cp ruoyi-app:/app/upload ./upload_backup

6.6 日志管理

# 查看应用日志
docker-compose logs -f --tail=100 ruoyi-app

# 配置日志轮转
logging:
  driver: "json-file"
  options:
    max-size: "10m"
    max-file: "3"

7. 生产环境部署建议

7.1 安全配置

# 生产环境docker-compose.yml
services:
  mysql:
    environment:
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql_root_password
    secrets:
      - mysql_root_password

secrets:
  mysql_root_password:
    file: ./secrets/mysql_root_password.txt

7.2 反向代理

使用Nginx作为反向代理:

upstream ruoyi {
    server localhost:8080;
}

server {
    listen 80;
    server_name your-domain.com;
    
    location / {
        proxy_pass http://ruoyi;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

7.3 监控配置

# 添加监控服务
services:
  prometheus:
    image: prom/prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml

8. 扩展篇

posted @ 2025-06-02 21:08  生命博爱  阅读(389)  评论(0)    收藏  举报