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

配置亮点解析:

  1. 服务依赖管理:通过depends_on确保启动顺序
  2. 健康检查:各服务配置健康监测策略
  3. 时区统一:所有容器使用东八区时间
  4. 生产环境配置:通过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

常见问题解决方案:

  1. MySQL连接失败:

    • 检查depends_on和健康检查配置
    • 验证数据库用户权限
    docker exec -it mysql-db mysql -uroot -p
    
  2. Redis超时问题:

    • 确认Redis配置文件已正确挂载
    • 检查网络连通性
    docker exec -it redis-cache redis-cli ping
    
  3. 端口冲突:

    • 修改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. 开发效率提升技巧

  1. 快速重启:

    # 只重建微服务容器
    docker-compose up -d --no-deps --build app
    
  2. 数据库管理:

    # 执行SQL文件
    docker exec -i mysql-db mysql -uroot -psecurepassword order_db < init.sql
    
  3. 缓存清理:

    docker exec redis-cache redis-cli FLUSHALL
    
  4. 一键测试:

    # 运行测试后自动清理
    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

通过以上方案,我们实现了从开发到生产的全流程容器化部署。这种架构不仅提升了部署效率,还保证了环境一致性,让开发者可以更专注于业务逻辑的实现。

更多推荐