Docker Compose部署SpringBoot与MySQL连接失败问题求助
解决Docker Compose中SpringBoot无法连接MySQL的问题
问题原因分析
- Hostname配置错误:你在docker-compose的
mysqldb服务里把hostname放在了environment字段下,这是无效配置。Docker Compose中容器的hostname需要作为服务的独立配置项,而非环境变量。 - MySQL服务未就绪:
depends_on仅保证mysqldb容器先启动,但不保证MySQL服务完成初始化并可接受连接。SpringBoot启动时可能MySQL还在初始化,导致连接超时抛出通信异常。
修正后的docker-compose.yml
services: mysqldb: image: mysql restart: always hostname: mysqldb # 将hostname移至服务顶级配置,而非环境变量 environment: MYSQL_ROOT_PASSWORD: 1234 MYSQL_USER: a MYSQL_PASSWORD: a MYSQL_DATABASE: studentdb ports: - "3306:3306" networks: - springboot-mysql-net healthcheck: # 添加健康检查,确保MySQL服务就绪 test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p1234"] interval: 5s timeout: 5s retries: 5 springboot-container: image: springboot-studentservice environment: dbname: mysqldb ports: - "8080:8080" depends_on: mysqldb: condition: service_healthy # 等待MySQL健康检查通过后再启动 networks: - springboot-mysql-net networks: springboot-mysql-net: driver: bridge
额外说明
- 健康检查通过
mysqladmin ping验证MySQL服务可用性,避免SpringBoot因数据库未初始化完成而连接失败。 - Docker Compose默认会将服务名(如
mysqldb)作为容器的DNS别名,即便不额外配置hostname,SpringBoot也能通过服务名直接访问MySQL容器。
内容的提问来源于stack exchange,提问作者Peek0
相关产品推荐
相关产品推荐

