使用Docker Compose部署Spring Boot+MySQL应用时出现Liquibase连接错误
Liquibase连接MySQL被拒绝的排查步骤
1. 检查Docker Compose网络连通性
- 进入Spring Boot应用容器,执行
ping mysql(假设docker-compose中MySQL服务名为mysql),验证服务名是否能解析到对应容器IP - 在Spring Boot容器内执行
telnet <mysql容器IP> 3306(IP可通过docker inspect <mysql容器ID>获取),确认3306端口是否开放 - 确认两个服务处于同一自定义网络下:docker-compose默认bridge网络可能存在解析延迟,建议显式定义网络并将两个服务加入其中
2. 验证MySQL服务是否完全就绪
- 查看MySQL容器日志:
docker logs <mysql容器ID>,确认日志中出现ready for connections字样,避免Spring Boot启动时MySQL未完成初始化 - 进入MySQL容器,执行
mysql -u<配置的用户名> -p<配置的密码>,手动验证数据库登录是否正常,同时确认目标业务数据库已创建 - 检查MySQL连接限制:确认docker-compose中是否通过
command参数设置了--bind-address=0.0.0.0,避免仅允许本地连接
3. 核对Spring Boot配置正确性
- 检查application.yml中的数据库URL:必须使用Docker Compose的MySQL服务名作为主机地址(例如
jdbc:mysql://mysql:3306/your_db),禁止使用localhost或宿主机IP - 确认数据库用户名、密码与docker-compose中MySQL服务的
MYSQL_USER、MYSQL_PASSWORD完全匹配 - 补充MySQL 8.0必需的连接参数:URL中添加
useSSL=false&allowPublicKeyRetrieval=true,避免因SSL或公钥检索问题触发连接异常
4. 检查Liquibase配置细节
- 确认Liquibase配置(application.yml的
liquibase节点或独立配置文件)中的url、username、password与Spring Boot主数据库配置完全一致 - 验证Liquibase变更文件路径配置正确:避免因找不到变更文件导致的异常被包装为连接拒绝错误
- 确认Spring Boot 3.x项目已引入正确依赖:
spring-boot-starter-liquibase,避免自动配置失效
5. 排查容器启动顺序问题
- 在docker-compose.yml中为Spring Boot服务添加健康检查依赖,确保MySQL完全就绪后再启动应用:
services: mysql: image: mysql:8.0.27 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"] interval: 5s timeout: 5s retries: 5 app: build: . depends_on: mysql: condition: service_healthy - 手动分步启动:先启动MySQL容器,等待1-2分钟确认服务就绪后再启动Spring Boot容器,验证是否为启动顺序导致的问题
6. 检查宿主机端口冲突
- 执行
netstat -tulpn | grep 3306(Linux)或netstat -ano | findstr :3306(Windows),确认宿主机3306端口未被其他进程占用 - 若docker-compose中MySQL服务映射了宿主机端口,可暂时去掉端口映射,仅使用容器内部网络连接测试
内容的提问来源于stack exchange,提问作者Musni
相关产品推荐
相关产品推荐

