Docker Compose部署Spring微服务无法连接MySQL容器问题
Spring微服务Docker部署连接MySQL失败排查方案
1. 数据库未完全启动就发起连接
Docker Compose默认并行启动所有容器,MySQL启动需要完成初始化(创建库表、加载配置等),耗时比Spring服务长,导致Spring服务启动时数据库还没就绪。
- 解决办法:在docker-compose.yml中给MySQL配置健康检查,让Spring服务等MySQL完全就绪后再启动:
services: mysqldb: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: payment_db MYSQL_USER: user MYSQL_PASSWORD: pass healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uuser", "-ppass"] interval: 5s timeout: 5s retries: 5 payment-service: build: ./payment-service depends_on: mysqldb: condition: service_healthy environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysqldb:3306/payment_db?useSSL=false&serverTimezone=UTC
2. 数据库连接地址配置错误
如果Spring配置里写的是localhost或127.0.0.1,容器内的localhost指向自身容器,根本访问不到MySQL容器。
- 解决办法:修改payment-service的application.yml,把数据库host改成docker-compose.yml里MySQL的服务名(比如
mysqldb):spring: datasource: url: jdbc:mysql://mysqldb:3306/payment_db?useSSL=false&serverTimezone=UTC username: user password: pass driver-class-name: com.mysql.cj.jdbc.Driver
3. MySQL用户权限限制
如果创建的用户仅允许localhost访问,Docker内部网络的其他容器(IP不是localhost)会被拒绝连接,这也是为什么你进MySQL容器能连,外部容器连不上的原因。
- 解决办法:进入MySQL容器,给用户授权允许从任意IP访问:
也可以在docker-compose.yml里挂载初始化脚本,启动时自动执行授权语句。docker exec -it <你的mysql容器ID> bash mysql -u root -p # 执行授权命令 GRANT ALL PRIVILEGES ON payment_db.* TO 'user'@'%' IDENTIFIED BY 'pass'; FLUSH PRIVILEGES;
4. JDBC驱动与MySQL版本不兼容
MySQL 8.0+必须使用com.mysql.cj.jdbc.Driver,而且URL里必须指定时区,旧驱动或缺少时区配置都会导致连接失败。
- 解决办法:
- 确保项目依赖的JDBC驱动版本兼容:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> - 数据库URL必须包含时区参数,比如
serverTimezone=UTC,同时指定正确的驱动类。
- 确保项目依赖的JDBC驱动版本兼容:
内容的提问来源于stack exchange,提问作者Viktar Nikanenka
相关产品推荐
相关产品推荐

