Docker Compose 编排 3 服务:SpringBoot + MySQL + Nginx 一键部署
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
关键特性说明 :
- 服务依赖管理 :通过
depends_on确保启动顺序 - 自定义网络 :创建独立网络保证服务间安全通信
- 健康检查 :确保数据库就绪后再启动应用
- 环境变量 :敏感信息通过环境变量注入(建议使用.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
解决方案 :
- 检查网络是否联通:
docker-compose exec backend ping mysql - 验证数据库健康状态:
docker-compose logs mysql - 检查连接字符串配置
问题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. 安全加固措施
-
最小权限原则 :
services: mysql: user: "1000:1000" read_only: true -
网络隔离 :
networks: app-network: internal: true -
敏感信息管理 :
# 在.env文件中配置(加入.gitignore) DB_ROOT_PASSWORD=your_secure_password -
镜像扫描 :
docker scan springboot-app -
更新策略 :
services: backend: image: your-registry/springboot-app:${TAG:-latest} restart: unless-stopped
这套编排方案已在多个生产环境中验证,能够稳定支持日均百万级请求。实际部署时,建议根据具体业务需求调整 JVM 参数、数据库连接池大小和 Nginx 工作进程数等关键参数。
更多推荐


所有评论(0)