fundplatform/docker-compose.yml
zhangjf 5b80e237b9 feat: Docker容器化部署和Prometheus+Grafana监控
## Docker 容器化部署

### 新增文件
- Dockerfile: 多阶段构建镜像,支持 Java 21
- docker-compose.yml: 完整服务编排配置
  - 基础设施: MySQL 8.0, Redis 7, Nacos 3.0
  - 监控: Prometheus, Grafana
  - 业务服务: Gateway + 9个微服务
- docker/.env: 环境变量配置
- docker/mysql/init/01-init.sql: 数据库初始化脚本

### Docker 特性
- 多阶段构建优化镜像大小
- 非 root 用户运行服务
- 健康检查配置
- 统一时区设置 (Asia/Shanghai)

## Prometheus + Grafana 监控

### Prometheus 配置
- docker/prometheus/prometheus.yml: 服务发现配置
- docker/prometheus/rules/alerts.yml: 告警规则
  - 服务可用性告警
  - JVM 内存告警
  - HTTP 请求告警
  - 数据库连接池告警
  - 系统资源告警

### Grafana 配置
- docker/grafana/provisioning/: 数据源和Dashboard自动导入
- docker/grafana/dashboards/fund-platform-dashboard.json
  - 服务概览面板
  - JVM 内存监控
  - 数据库连接池监控

### Spring Boot Actuator 集成
- pom.xml: 添加 spring-boot-starter-actuator 和 micrometer-registry-prometheus
- application-docker.yml: Prometheus 端点配置

## 服务端口规划
- Gateway: 8000
- fund-sys: 8100
- fund-cust: 8200
- fund-proj: 8300
- fund-req: 8400
- fund-exp: 8500
- fund-receipt: 8600
- fund-report: 8700
- fund-file: 8800
- Prometheus: 9090
- Grafana: 3000
- Nacos: 8848
2026-02-19 18:48:15 +08:00

437 lines
10 KiB
YAML

# 资金服务平台 - Docker Compose 编排配置
# 版本: 1.0
version: '3.8'
services:
# ==================== 基础设施服务 ====================
# MySQL 数据库
mysql:
image: mysql:8.0
container_name: fund-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
MYSQL_DATABASE: fund_platform
TZ: Asia/Shanghai
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./docker/mysql/init:/docker-entrypoint-initdb.d:ro
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --default-authentication-plugin=mysql_native_password
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
networks:
- fund-network
# Redis 缓存
redis:
image: redis:7-alpine
container_name: fund-redis
restart: unless-stopped
ports:
- "6379:6379"
volumes:
- redis_data:/data
command: redis-server --appendonly yes
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
networks:
- fund-network
# Nacos 注册中心 & 配置中心
nacos:
image: nacos/nacos-server:v3.0.0
container_name: fund-nacos
restart: unless-stopped
environment:
MODE: standalone
SPRING_DATASOURCE_PLATFORM: mysql
MYSQL_SERVICE_HOST: mysql
MYSQL_SERVICE_PORT: 3306
MYSQL_SERVICE_DB_NAME: nacos_config
MYSQL_SERVICE_USER: root
MYSQL_SERVICE_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
NACOS_AUTH_TOKEN: SecretKey012345678901234567890123456789012345678901234567890123456789
NACOS_AUTH_IDENTITY_KEY: serverIdentity
NACOS_AUTH_IDENTITY_VALUE: security
ports:
- "8848:8848"
- "9848:9848"
- "9849:9849"
volumes:
- nacos_data:/home/nacos/logs
depends_on:
mysql:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8848/nacos/v1/console/health/readiness"]
interval: 30s
timeout: 10s
retries: 10
start_period: 60s
networks:
- fund-network
# ==================== 监控服务 ====================
# Prometheus 监控
prometheus:
image: prom/prometheus:v2.48.0
container_name: fund-prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- ./docker/prometheus/rules:/etc/prometheus/rules:ro
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=15d'
- '--web.enable-lifecycle'
networks:
- fund-network
# Grafana 可视化
grafana:
image: grafana/grafana:10.2.0
container_name: fund-grafana
restart: unless-stopped
environment:
GF_SECURITY_ADMIN_USER: admin
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD:-admin123}
GF_USERS_ALLOW_SIGN_UP: "false"
GF_SERVER_ROOT_URL: http://localhost:3000
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
- ./docker/grafana/provisioning:/etc/grafana/provisioning:ro
- ./docker/grafana/dashboards:/var/lib/grafana/dashboards:ro
depends_on:
- prometheus
networks:
- fund-network
# ==================== 业务微服务 ====================
# API 网关
gateway:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-gateway
container_name: fund-gateway
restart: unless-stopped
environment:
SERVER_PORT: 8000
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
JAVA_OPTS: -Xms256m -Xmx512m
ports:
- "8000:8000"
depends_on:
nacos:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/actuator/health"]
interval: 30s
timeout: 10s
retries: 5
start_period: 120s
networks:
- fund-network
# 系统服务
fund-sys:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-sys
container_name: fund-sys
restart: unless-stopped
environment:
SERVER_PORT: 8100
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DB: fund_platform
MYSQL_USER: root
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
REDIS_HOST: redis
REDIS_PORT: 6379
JAVA_OPTS: -Xms256m -Xmx512m
ports:
- "8100:8100"
depends_on:
nacos:
condition: service_healthy
mysql:
condition: service_healthy
redis:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8100/actuator/health"]
interval: 30s
timeout: 10s
retries: 5
start_period: 120s
networks:
- fund-network
# 客户服务
fund-cust:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-cust
container_name: fund-cust
restart: unless-stopped
environment:
SERVER_PORT: 8200
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DB: fund_platform
MYSQL_USER: root
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
JAVA_OPTS: -Xms256m -Xmx512m
ports:
- "8200:8200"
depends_on:
nacos:
condition: service_healthy
mysql:
condition: service_healthy
networks:
- fund-network
# 项目服务
fund-proj:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-proj
container_name: fund-proj
restart: unless-stopped
environment:
SERVER_PORT: 8300
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DB: fund_platform
MYSQL_USER: root
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
JAVA_OPTS: -Xms256m -Xmx512m
ports:
- "8300:8300"
depends_on:
nacos:
condition: service_healthy
mysql:
condition: service_healthy
networks:
- fund-network
# 需求工单服务
fund-req:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-req
container_name: fund-req
restart: unless-stopped
environment:
SERVER_PORT: 8400
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DB: fund_platform
MYSQL_USER: root
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
JAVA_OPTS: -Xms256m -Xmx512m
ports:
- "8400:8400"
depends_on:
nacos:
condition: service_healthy
mysql:
condition: service_healthy
networks:
- fund-network
# 支出服务
fund-exp:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-exp
container_name: fund-exp
restart: unless-stopped
environment:
SERVER_PORT: 8500
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DB: fund_platform
MYSQL_USER: root
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
JAVA_OPTS: -Xms256m -Xmx512m
ports:
- "8500:8500"
depends_on:
nacos:
condition: service_healthy
mysql:
condition: service_healthy
networks:
- fund-network
# 收款服务
fund-receipt:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-receipt
container_name: fund-receipt
restart: unless-stopped
environment:
SERVER_PORT: 8600
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DB: fund_platform
MYSQL_USER: root
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
JAVA_OPTS: -Xms256m -Xmx512m
ports:
- "8600:8600"
depends_on:
nacos:
condition: service_healthy
mysql:
condition: service_healthy
networks:
- fund-network
# 报表服务
fund-report:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-report
container_name: fund-report
restart: unless-stopped
environment:
SERVER_PORT: 8700
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DB: fund_platform
MYSQL_USER: root
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
JAVA_OPTS: -Xms256m -Xmx512m
ports:
- "8700:8700"
depends_on:
nacos:
condition: service_healthy
mysql:
condition: service_healthy
networks:
- fund-network
# 文件服务
fund-file:
build:
context: .
dockerfile: Dockerfile
args:
MODULE: fund-file
container_name: fund-file
restart: unless-stopped
environment:
SERVER_PORT: 8800
SPRING_PROFILES_ACTIVE: docker
NACOS_SERVER_ADDR: nacos:8848
NACOS_USERNAME: nacos
NACOS_PASSWORD: nacos
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DB: fund_platform
MYSQL_USER: root
MYSQL_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123}
JAVA_OPTS: -Xms256m -Xmx512m
ports:
- "8800:8800"
depends_on:
nacos:
condition: service_healthy
mysql:
condition: service_healthy
networks:
- fund-network
# ==================== 网络配置 ====================
networks:
fund-network:
driver: bridge
name: fund-network
# ==================== 数据卷 ====================
volumes:
mysql_data:
name: fund-mysql-data
redis_data:
name: fund-redis-data
nacos_data:
name: fund-nacos-data
prometheus_data:
name: fund-prometheus-data
grafana_data:
name: fund-grafana-data