Docker容器中Spring应用无法连接MySQL数据库的解决问询
Spring Docker容器无法连接MySQL的解决方案
关键问题与修复
1. 数据库连接地址错误
Docker容器内的localhost指向容器自身,而非MySQL服务容器。在Docker Compose同一网络中,服务可通过服务名称(即mysqldb)互相访问,因此需修改Spring的数据源URL:
SPRING_DATASOURCE_URL: jdbc:mysql://mysqldb:3306/buddyto_mstr_local?useSSL=false&allowPublicKeyRetrieval=true
添加allowPublicKeyRetrieval=true是因为MySQL 8.0默认限制公钥检索,避免连接失败。
2. MySQL环境变量配置错误
mysqldb服务中的MYSQL_USERNAME是无效变量,正确创建用户的变量为MYSQL_USER。若使用root用户连接,可简化环境变量,仅保留必要项:
environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=buddyto_mstr_local
3. 服务就绪等待问题
depends_on仅控制启动顺序,不保证MySQL完全就绪。需添加健康检查,让Spring服务在MySQL就绪后再启动:
在mysqldb服务中加入健康检查配置,同时修改sample-service的depends_on条件。
修正后的完整docker-compose.yml
version: "3" services: sample-service: image: v2stechit/sample-service ports: - "8080:8080" restart: always environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysqldb:3306/buddyto_mstr_local?useSSL=false&allowPublicKeyRetrieval=true SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: root networks: - spring-mysql depends_on: mysqldb: condition: service_healthy mysqldb: image: mysql:8.0.29 networks: - spring-mysql environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=buddyto_mstr_local ports: - 3306:3306 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-proot"] interval: 5s timeout: 5s retries: 5 networks: spring-mysql:
额外排查点
- 确认Spring项目的MySQL驱动版本与MySQL 8.0兼容,推荐使用
mysql-connector-java:8.0.29及以上版本。 - 若仍遇认证失败,可在
mysqldb环境变量中添加MYSQL_INITDB_ARGS="--default-authentication-plugin=mysql_native_password",适配旧驱动的加密规则。
验证步骤
- 清理现有容器:
docker-compose down - 启动服务:
docker-compose up -d - 查看Spring日志:
docker-compose logs sample-service,确认数据库连接状态。
内容的提问来源于stack exchange,提问作者DarkDead
相关产品推荐
相关产品推荐

