You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot JPA连接Docker容器MySQL时用户访问被拒绝问题

解决Spring Boot连接Docker中MySQL的访问拒绝问题

问题根源分析

你碰到的Access denied for user 'springuser'@'localhost'错误,主要来自两个核心问题:

  1. Docker容器端口未映射:你的docker run命令没有把容器内的3306端口映射到宿主机,导致宿主机上的Spring Boot应用根本无法通过localhost:3306访问到容器里的MySQL服务。
  2. MySQL 8.0的认证插件兼容问题:MySQL 8.0默认使用caching_sha2_password认证插件,部分JDBC驱动版本对这个插件的兼容性不够,会导致认证失败。

步骤1:重新启动MySQL容器并映射端口

先停止并删除现有容器,重新启动时添加端口映射参数:

# 停止正在运行的容器
docker stop mysql
# 删除旧容器
docker rm mysql
# 重新启动容器,添加端口映射
docker run --name mysql -e MYSQL_ROOT_PASSWORD=mypass123 -p 3306:3306 -d mysql:8.0.1

参数说明:-p 3306:3306表示把宿主机的3306端口和容器内的3306端口绑定,这样宿主机的应用就能通过localhost:3306访问容器中的MySQL了。


步骤2:调整MySQL用户的认证插件

由于MySQL 8.0默认的认证插件可能和你的JDBC驱动不兼容,需要将springuser的认证方式改为旧版兼容的mysql_native_password:

  1. 进入容器终端:
docker exec -it mysql bash -l
  1. 登录MySQL控制台:
mysql -uroot -p

输入密码mypass123后,执行以下SQL命令:

-- 修改springuser的认证插件并重置密码(密码和你之前设置的一致即可)
ALTER USER 'springuser'@'%' IDENTIFIED WITH mysql_native_password BY 'ThePassword';
-- 刷新权限使配置生效
FLUSH PRIVILEGES;

步骤3:优化Spring Boot配置(可选但推荐)

调整你的application.properties,补充时区和SSL相关配置,避免额外的连接警告:

spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://localhost:3306/db_example?useSSL=false&serverTimezone=UTC
spring.datasource.username=springuser
spring.datasource.password=ThePassword
# 明确指定驱动类(Spring Boot 2.x+可自动识别,但显式配置更稳妥)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

最后验证

重新启动你的Spring Boot应用,现在应该能正常连接到Docker中的MySQL数据库了。如果还有问题,可以检查:

  • 宿主机防火墙是否允许3306端口的入站访问
  • 用docker ps确认MySQL容器是否处于运行状态
  • 再次登录MySQL控制台,确认springuser的权限和密码配置正确

内容的提问来源于stack exchange,提问作者Martyn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:14:32