使用 Docker 搭建 Java(SpringBoot)开发环境
本指南介绍如何用 Docker 和 Docker Compose 构建典型的 Java(Spring Boot)应用开发环境,并集成常用中间件服务,如 MySQL、Redis、Kafka。适用于个人开发、团队协作与一体化本地测试。
一、目录结构建议
project-root/
├── app/ # SpringBoot 应用源码目录
│ ├── Dockerfile
│ └── ...
├── docker-compose.yml # Compose 主配置
├── mysql-data/ # MySQL 数据卷(本地开发用,加入 .gitignore)
├── redis-data/ # Redis 数据卷(同上)
└── .env # 环境变量配置(如端口、密码,勿提交敏感数据)
二、SpringBoot 应用 Dockerfile 示例
# app/Dockerfile
FROM eclipse-temurin:17-jdk-alpine
WORKDIR /app
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
- 注意:构建镜像前需本地或CI中打包
mvn clean package -DskipTests
生成 jar 包。
三、docker-compose.yml 配置详解
version: "3.9"
services:
app:
build:
context: ./app
dockerfile: Dockerfile
container_name: springboot-app
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/devdb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
SPRING_DATASOURCE_USERNAME: devuser
SPRING_DATASOURCE_PASSWORD: devpass
SPRING_REDIS_HOST: redis
SPRING_REDIS_PORT: 6379
SPRING_KAFKA_BOOTSTRAP_SERVERS: kafka:9092
depends_on:
- mysql
- redis
- kafka
mysql:
image: mysql:8.0
container_name: mysql
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: devdb
MYSQL_USER: devuser
MYSQL_PASSWORD: devpass
volumes:
- ./mysql-data:/var/lib/mysql
redis:
image: redis:7
container_name: redis
restart: always
ports:
- "6379:6379"
volumes:
- ./redis-data:/data
zookeeper:
image: bitnami/zookeeper:3.8
container_name: zookeeper
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
ports:
- "2181:2181"
kafka:
image: bitnami/kafka:3.5
container_name: kafka
depends_on:
- zookeeper
environment:
KAFKA_BROKER_ID: 1
KAFKA_CFG_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
ALLOW_PLAINTEXT_LISTENER: "yes"
ports:
- "9092:9092"
说明:
depends_on
保证应用启动顺序,但不保证服务已完全就绪,生产建议配合 healthcheck。- 各服务通过服务名(如 mysql、redis、kafka)互联,SpringBoot 只需用服务名作为 host。
四、运行流程
- 构建 SpringBoot 应用 jar 包
cd app mvn clean package -DskipTests cd ..
- 启动所有服务
docker compose up -d --build
- 查看服务状态
docker compose ps
- 查看应用日志
docker compose logs -f app
- 访问应用
- 浏览器或 Postman 访问 http://localhost:8080
五、常见注意事项
端口冲突
- 如本地已有 MySQL/Redis 服务,需调整 compose 暴露端口或关闭本地服务。
数据持久化
- 挂载本地目录(如 mysql-data/、redis-data/)避免容器重启后数据丢失。
- 不建议将这些数据卷提交进版本控制(加入 .gitignore)。
环境变量与配置安全
.env
文件可集中管理端口、密码等,生产环境应避免明文密码。- 不要把敏感数据上传到代码仓库。
Kafka 配置
- Kafka 依赖 Zookeeper,需保证 Zookeeper 先启动。
- 默认配置适合开发调试,生产建议单独网络、鉴权等更严格配置。
服务连接
- SpringBoot 的配置中数据库、Redis、Kafka 的 host 必须与 Compose 服务名一致。
- 配置样例(application.yml):
spring: datasource: url: jdbc:mysql://mysql:3306/devdb?... username: devuser password: devpass redis: host: redis port: 6379 kafka: bootstrap-servers: kafka:9092
热部署开发
- 推荐用 IDE 的远程调试、或挂载源码进容器实现热部署(可选)。
- 也可开发时本地运行 SpringBoot,仅用 Docker 启动中间件。
初次启动慢
- 首次启动需拉取镜像,视网速可能较慢,后续会提升。
- 如需要更多中间件(如 MongoDB、RabbitMQ),可按需添加 service。
六、推荐扩展
- 数据库初始化脚本:可将 sql 脚本挂载到
/docker-entrypoint-initdb.d/
(MySQL)。 - 自定义网络:如需与其他项目互通,可用
networks
字段自定义网络。 - 健康检查:为关键服务添加
healthcheck
,提升健壮性。 - 分环境配置:用不同
docker-compose.override.yml
管理开发/测试/生产环境差异。