You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot+Docker-Compose连接本地MySQL遇通信链路故障求助

问题排查与解决方案

一、Docker Compose环境下的核心修复步骤

1. 修正Redis连接配置

你的Spring Boot容器里配置了spring.redis.host=localhost,但Docker容器内的localhost仅指向容器自身,无法访问Redis容器。需将Redis主机名改为容器名my-redis:

- spring.redis.host=my-redis

2. 确保MySQL服务就绪后启动应用

depends_on仅保证容器启动顺序,不确保MySQL服务完全就绪。可以通过以下两种方式解决:

方案1:给MySQL容器添加健康检查

修改docker-compose.yml中mysqldb服务配置,让Docker等待MySQL服务就绪:

mysqldb:
  image: mysql:8.0.28-oracle
  container_name: case-mysqldb
  restart: always
  environment:
    MYSQL_DATABASE: 'mysql-db'
    MYSQL_USER: 'user'
    MYSQL_PASSWORD: 'password'
    MYSQL_ROOT_PASSWORD: 'password'
  networks:
    - local-network
  ports:
    - '3306:3306'
  volumes:
    - case-mysql-data:/var/lib/mysql
    - ./mysql-db-dump.sql:/docker-entrypoint-initdb.d/mysql-db-dump.sql:ro
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uuser", "-ppassword"]
    interval: 5s
    timeout: 5s
    retries: 5

同时更新app服务的depends_on,依赖MySQL的健康状态:

depends_on:
  redis:
    condition: service_started
  mysqldb:
    condition: service_healthy

方案2:给Spring Boot添加连接重试逻辑

在环境变量中补充Hikari连接池的重试配置:

- spring.datasource.hikari.connection-timeout=30000
- spring.datasource.hikari.maximum-pool-size=10
- spring.datasource.hikari.connection-test-query=SELECT 1
- spring.datasource.hikari.validation-timeout=5000

3. 验证MySQL用户访问权限

MySQL 8.0默认创建的用户可能仅允许localhost访问,需确保user用户允许从容器网络访问。在初始化脚本mysql-db-dump.sql中添加:

GRANT ALL PRIVILEGES ON `mysql-db`.* TO 'user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

二、本地运行Spring Boot时的配置修正

当你直接在本地启动Spring Boot(不通过Docker)时,数据库地址不能用case-mysqldb,需改为localhost:

spring.datasource.url=jdbc:mysql://localhost:3306/mysql-db

此时Redis地址保持localhost即可,因为本地Redis运行在宿主机。

三、额外排查点

  1. 查看MySQL容器日志:执行docker logs case-mysqldb,检查是否有初始化失败、服务启动异常等信息。
  2. 测试容器网络连通性:进入Spring Boot容器ping MySQL容器,确认网络正常:
docker exec -it case-study ping case-mysqldb
  1. 统一时区配置:MySQL与应用时区不一致可能导致连接失败,给MySQL容器添加时区环境变量:
- TZ=Asia/Shanghai

同时在Spring Boot数据源URL中补充时区参数:

- spring.datasource.url=jdbc:mysql://case-mysqldb:3306/mysql-db?serverTimezone=Asia/Shanghai

内容的提问来源于stack exchange,提问作者levniko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 19:16:19