Spring Boot JPA连接Docker容器MySQL时用户访问被拒绝问题
解决Spring Boot连接Docker中MySQL的访问拒绝问题
问题根源分析
你碰到的Access denied for user 'springuser'@'localhost'错误,主要来自两个核心问题:
- Docker容器端口未映射:你的
docker run命令没有把容器内的3306端口映射到宿主机,导致宿主机上的Spring Boot应用根本无法通过localhost:3306访问到容器里的MySQL服务。 - 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:
- 进入容器终端:
docker exec -it mysql bash -l
- 登录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
相关产品推荐
相关产品推荐

