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运行在宿主机。
三、额外排查点
- 查看MySQL容器日志:执行
docker logs case-mysqldb,检查是否有初始化失败、服务启动异常等信息。 - 测试容器网络连通性:进入Spring Boot容器ping MySQL容器,确认网络正常:
docker exec -it case-study ping case-mysqldb
- 统一时区配置:MySQL与应用时区不一致可能导致连接失败,给MySQL容器添加时区环境变量:
- TZ=Asia/Shanghai
同时在Spring Boot数据源URL中补充时区参数:
- spring.datasource.url=jdbc:mysql://case-mysqldb:3306/mysql-db?serverTimezone=Asia/Shanghai
内容的提问来源于stack exchange,提问作者levniko
相关产品推荐
相关产品推荐

