Docker Compose环境下Spring Boot容器无法连接MySQL容器求助
Spring Boot容器无法连接MySQL容器的问题排查与解决
问题现象
使用Docker Compose部署Spring Boot和MySQL容器时,Spring Boot容器抛出连接错误:
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
配置错误点及修正方案
1. 数据库连接端口配置错误
容器间通信需使用容器内部端口,而非映射到主机的端口。当前application.properties中误用了主机映射端口49152,应改为MySQL容器内部默认端口3306。
修正后的application.properties:
spring.datasource.url= jdbc:mysql://trips-db:3306/wslny?allowPublicKeyRetrieval=true&useSSL=false&createDatabaseIfNotExist=true spring.datasource.username= root spring.datasource.password= admin spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa.hibernate.ddl-auto= update
2. MySQL数据卷挂载路径错误
MySQL官方镜像的默认数据存储路径为/var/lib/mysql,当前配置挂载到/home/sharedData会导致MySQL无法正确初始化数据目录,引发数据库启动异常。
修正后的docker-compose.yml(trips-db服务部分):
trips-db: image: "mysql" container_name: "trips-db" volumes: - newDatabase:/var/lib/mysql # 修正为MySQL默认数据路径 ports: - 49152:3306 environment: - MYSQL_USER=adham - MYSQL_PASSWORD=123 - MYSQL_ROOT_PASSWORD=admin - MYSQL_DATABASE=wslny # 新增:自动初始化目标数据库
3. 容器启动顺序与健康检查缺失
Spring Boot容器可能在MySQL完全启动就绪前发起连接,导致失败。需添加依赖配置和MySQL健康检查,确保数据库就绪后再启动应用。
补充健康检查到docker-compose.yml的trips-db服务:
trips-db: # 其他配置... healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-padmin"] interval: 5s timeout: 5s retries: 5
修改trips-app服务的依赖配置:
trips-app: build: ./Wasalny_BE container_name: trips-app ports: - 8080:8080 depends_on: trips-db: condition: service_healthy # 等待MySQL健康检查通过后启动 links: - trips-db
4. 数据库初始化优化
添加MYSQL_DATABASE=wslny环境变量,让MySQL容器启动时自动创建目标数据库,无需依赖Spring Boot的createDatabaseIfNotExist参数,提升初始化可靠性。
最终部署命令
执行以下命令重新部署容器:
docker-compose up -d --force-recreate
内容的提问来源于stack exchange,提问作者Adham Ahmad
相关产品推荐
相关产品推荐

