Docker-compose实战:5分钟搞定微服务+MySQL+Redis一键部署
Docker-compose实战:5分钟搞定微服务+MySQL+Redis一键部署
在微服务架构的浪潮中,开发效率与部署便捷性成为团队的核心竞争力。传统部署方式需要手动管理多个容器的启动顺序、网络配置和依赖关系,不仅耗时耗力,还容易因环境差异导致"在我机器上能跑"的经典问题。本文将带你用Docker-compose这一利器,实现SpringBoot微服务与MySQL、Redis的一键式容器化部署,彻底告别繁琐的配置过程。
1. 环境准备与工具链配置
在开始编排容器之前,确保你的开发环境已经安装以下组件:
- Docker Engine 18.06+(社区版或企业版)
- Docker-compose 1.25.0+(推荐通过Docker Desktop安装)
- JDK 8/11(用于微服务打包)
- Maven/Gradle(项目构建工具)
验证安装是否成功:
# 检查Docker版本
docker --version
# 检查Docker-compose版本
docker-compose --version
提示:Windows/macOS用户建议直接安装Docker Desktop,它会自动包含所需全部组件。Linux用户需分别安装Docker Engine和Docker-compose。
2. 项目结构与容器规划
典型的微服务项目容器化部署需要考虑以下要素:
project-root/
├── docker-compose.yml # 编排主文件
├── microservice/
│ ├── Dockerfile # 微服务镜像构建文件
│ └── target/*.jar # 打包后的应用
├── mysql/
│ ├── conf/ # MySQL配置文件
│ └── init/ # 初始化SQL脚本
└── redis/
├── redis.conf # Redis配置文件
└── data/ # 持久化数据目录
关键设计原则:
- 每个服务独立配置:MySQL、Redis各自维护配置文件
- 数据持久化:通过volume挂载避免容器重启数据丢失
- 网络隔离:自定义网络实现服务间安全通信
3. 编写Docker-compose编排文件
以下是完整的docker-compose.yml示例,实现了微服务、MySQL和Redis的协同部署:
version: "3.8"
services:
app:
build: ./microservice
container_name: order-service
ports:
- "8080:8080"
networks:
- backend
depends_on:
- redis
- mysql
environment:
SPRING_PROFILES_ACTIVE: "prod"
mysql:
image: mysql:5.7
container_name: mysql-db
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/init:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: "securepassword"
MYSQL_DATABASE: "order_db"
TZ: "Asia/Shanghai"
networks:
- backend
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 10s
retries: 5
redis:
image: redis:6-alpine
container_name: redis-cache
ports:
- "6379:6379"
volumes:
- ./redis/data:/data
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
command: redis-server /usr/local/etc/redis/redis.conf
networks:
- backend
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 5
networks:
backend:
driver: bridge
配置亮点解析:
- 服务依赖管理:通过
depends_on确保启动顺序 - 健康检查:各服务配置健康监测策略
- 时区统一:所有容器使用东八区时间
- 生产环境配置:通过
SPRING_PROFILES_ACTIVE激活prod配置
4. 微服务关键配置调整
要使微服务正确连接容器化的MySQL和Redis,需要修改应用配置:
application-prod.properties:
# MySQL配置(使用服务名而非IP)
spring.datasource.url=jdbc:mysql://mysql-db:3306/order_db?useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=securepassword
# Redis配置
spring.redis.host=redis-cache
spring.redis.port=6379
spring.redis.timeout=5000
Dockerfile示例:
FROM openjdk:11-jre-slim
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
EXPOSE 8080
注意:在容器间通信时,应使用Docker-compose中定义的
container_name作为主机名,这是服务发现的关键。
5. 部署流程与问题排查
执行以下命令启动整个应用栈:
# 构建镜像并启动服务(后台模式)
docker-compose up -d --build
# 查看服务状态
docker-compose ps
# 查看实时日志
docker-compose logs -f app
常见问题解决方案:
-
MySQL连接失败:
- 检查
depends_on和健康检查配置 - 验证数据库用户权限
docker exec -it mysql-db mysql -uroot -p - 检查
-
Redis超时问题:
- 确认Redis配置文件已正确挂载
- 检查网络连通性
docker exec -it redis-cache redis-cli ping -
端口冲突:
- 修改
docker-compose.yml中的端口映射 - 检查主机端口占用情况
netstat -tuln | grep 3306 - 修改
性能优化建议:
- 为Java应用添加JVM参数:
-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 - MySQL配置适当的缓冲池大小
- Redis启用持久化和内存淘汰策略
6. 生产环境进阶配置
对于实际生产部署,还需要考虑以下增强配置:
资源限制与重启策略:
services:
app:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
restart: unless-stopped
日志驱动配置:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
多环境配置管理:
# 使用不同环境文件
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
监控方案建议:
- 使用
docker stats查看实时资源占用 - 配置Prometheus+Grafana监控容器指标
- 集成ELK收集应用日志
7. 开发效率提升技巧
-
快速重启:
# 只重建微服务容器 docker-compose up -d --no-deps --build app -
数据库管理:
# 执行SQL文件 docker exec -i mysql-db mysql -uroot -psecurepassword order_db < init.sql -
缓存清理:
docker exec redis-cache redis-cli FLUSHALL -
一键测试:
# 运行测试后自动清理 docker-compose run --rm app ./mvnw test
在持续集成流程中,可以将Docker-compose与CI工具结合:
# GitLab CI示例
deploy:
stage: deploy
script:
- docker-compose -f docker-compose.ci.yml build
- docker-compose -f docker-compose.ci.yml up -d
environment:
name: production
通过以上方案,我们实现了从开发到生产的全流程容器化部署。这种架构不仅提升了部署效率,还保证了环境一致性,让开发者可以更专注于业务逻辑的实现。
更多推荐

所有评论(0)