Docker Compose 编排 SpringBoot + MySQL + Nginx 全栈项目实战指南

在当今云原生时代,容器化技术已成为现代应用部署的标准方式。对于需要同时管理数据库、后端服务和前端代理的全栈开发者而言,如何高效协调多个容器服务成为关键挑战。本文将深入探讨使用 Docker Compose 编排 SpringBoot、MySQL 和 Nginx 三大组件的完整解决方案,提供从零开始的一站式部署指南。

1. 环境准备与项目结构规划

在开始编排之前,合理的项目结构设计能显著降低后续维护成本。建议采用以下目录结构:

project-root/
├── backend/
│   ├── src/
│   ├── Dockerfile
│   └── pom.xml
├── frontend/
│   ├── public/
│   ├── src/
│   └── Dockerfile
├── nginx/
│   └── nginx.conf
├── db/
│   └── init.sql
└── docker-compose.yml

关键目录说明

  • backend/ :SpringBoot 项目目录,包含 Java 源代码和 Maven 配置
  • frontend/ :前端项目目录(如存在)
  • nginx/ :Nginx 配置文件目录
  • db/ :数据库初始化脚本目录

提示:实际项目中可根据需要调整结构,但保持逻辑清晰是关键原则

2. 容器化 SpringBoot 应用

SpringBoot 应用的容器化是整套系统的核心。以下是一个生产级 Dockerfile 示例:

# 使用官方OpenJDK镜像作为基础
FROM eclipse-temurin:17-jdk-jammy

# 设置工作目录
WORKDIR /app

# 复制Maven构建产物
COPY target/*.jar app.jar

# 设置JVM参数
ENV JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"

# 暴露服务端口
EXPOSE 8080

# 健康检查配置
HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:8080/actuator/health || exit 1

# 容器启动命令
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app/app.jar"]

构建与测试命令

# 在backend目录下构建镜像
docker build -t springboot-app .

# 测试运行
docker run -p 8080:8080 --name sb-test springboot-app

3. MySQL 容器配置要点

数据库服务需要特别注意数据持久化和性能调优。在 docker-compose.yml 中可这样配置:

services:
  mysql:
    image: mysql:8.0
    container_name: mysql_db
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      TZ: Asia/Shanghai
    volumes:
      - mysql_data:/var/lib/mysql
      - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
    ports:
      - "3306:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 3s
      retries: 10
    command: 
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci
      --max_connections=200
      --innodb_buffer_pool_size=1G

volumes:
  mysql_data:

关键配置解析

配置项 说明 推荐值
volumes 数据持久化存储 必须配置
healthcheck 健康状态检测 建议配置
command 性能优化参数 根据服务器配置调整
TZ 时区设置 按实际需求

4. Nginx 反向代理与负载均衡

Nginx 作为前端入口,需要合理配置反向代理和静态资源服务。典型配置如下:

upstream backend {
    server backend:8080;
}

server {
    listen 80;
    server_name example.com;

    # 静态资源处理
    location /static/ {
        alias /var/www/static/;
        expires 30d;
    }

    # API反向代理
    location /api/ {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        # 超时设置
        proxy_connect_timeout 60s;
        proxy_read_timeout 300s;
    }

    # 前端路由处理(SPA应用)
    location / {
        try_files $uri $uri/ /index.html;
    }
}

对应的 Dockerfile 示例:

FROM nginx:1.25-alpine

# 移除默认配置
RUN rm /etc/nginx/conf.d/default.conf

# 复制自定义配置
COPY nginx.conf /etc/nginx/conf.d/app.conf

# 复制静态资源
COPY frontend/dist /var/www/static

EXPOSE 80

5. 完整的 docker-compose.yml 编排

将所有服务整合的完整编排文件示例:

version: '3.8'

services:
  backend:
    build: ./backend
    container_name: springboot_app
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/${DB_NAME}?useSSL=false
      SPRING_DATASOURCE_USERNAME: ${DB_USER}
      SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD}
      SPRING_PROFILES_ACTIVE: prod
    ports:
      - "8080:8080"
    depends_on:
      mysql:
        condition: service_healthy
    networks:
      - app-network
    restart: unless-stopped

  mysql:
    image: mysql:8.0
    # ... 前述MySQL配置 ...
    networks:
      - app-network

  nginx:
    build: ./nginx
    container_name: nginx_proxy
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - backend
    networks:
      - app-network
    restart: unless-stopped

networks:
  app-network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/24

关键特性说明

  1. 服务依赖管理 :通过 depends_on 确保启动顺序
  2. 自定义网络 :创建独立网络保证服务间安全通信
  3. 健康检查 :确保数据库就绪后再启动应用
  4. 环境变量 :敏感信息通过环境变量注入(建议使用.env文件)

6. 高级部署技巧与优化建议

6.1 资源限制与调度

在生产环境中,应对容器资源进行限制:

services:
  backend:
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 1.5G
        reservations:
          memory: 512M

6.2 日志收集配置

统一日志格式便于后续分析:

services:
  backend:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
        tag: "springboot"

6.3 多环境配置管理

使用不同 compose 文件适应各环境:

# 开发环境
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up

# 生产环境 
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up

6.4 常用运维命令

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f backend

# 执行数据库迁移
docker-compose exec backend ./migrate.sh

# 一键启停
docker-compose up -d
docker-compose down

# 带数据卷清理
docker-compose down -v

7. 典型问题排查指南

问题1:SpringBoot 无法连接 MySQL

解决方案

  1. 检查网络是否联通: docker-compose exec backend ping mysql
  2. 验证数据库健康状态: docker-compose logs mysql
  3. 检查连接字符串配置

问题2:Nginx 502 Bad Gateway

排查步骤

# 检查后端服务是否运行
docker-compose ps

# 测试后端API可达性
docker-compose exec nginx curl -v http://backend:8080/actuator/health

# 检查Nginx错误日志
docker-compose logs nginx | grep error

问题3:容器启动顺序导致应用报错

解决方案

depends_on:
  mysql:
    condition: service_healthy

配合健康检查:

healthcheck:
  test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
  interval: 5s
  timeout: 3s
  retries: 10

8. 安全加固措施

  1. 最小权限原则

    services:
      mysql:
        user: "1000:1000"
        read_only: true
    
  2. 网络隔离

    networks:
      app-network:
        internal: true
    
  3. 敏感信息管理

    # 在.env文件中配置(加入.gitignore)
    DB_ROOT_PASSWORD=your_secure_password
    
  4. 镜像扫描

    docker scan springboot-app
    
  5. 更新策略

    services:
      backend:
        image: your-registry/springboot-app:${TAG:-latest}
        restart: unless-stopped
    

这套编排方案已在多个生产环境中验证,能够稳定支持日均百万级请求。实际部署时,建议根据具体业务需求调整 JVM 参数、数据库连接池大小和 Nginx 工作进程数等关键参数。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐