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

配置Spring Boot连接Docker化MySQL遇权限拒绝问题排查

问题

启动Spring Boot项目时反复出现以下异常:

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)

我的application.properties配置:

spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=MyPassword

docker-compose.yml配置:

# Use root/example as user/password credentials
version: '3.1'

services:

  db:
    image: mysql:8.0
    # NOTE: use of "mysql_native_password" is not recommended: https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password
    # (this is just an example, not intended to be a production configuration)
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: MyPassword

  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080

我能通过Adminer用上述凭据成功连接数据库,执行查询:

SELECT user, plugin FROM mysql.user;

得到结果:

| user    | plugin
+---------+-----------------------
| root    | mysql_native_password

数据库和Adminer通过docker-compose启动,Spring Boot项目未容器化,单独在宿主机启动,请问连接配置哪里有问题?

环境信息:

org.springframework.boot -> 3.0
OS -> Ubuntu 22.04
Dockerized MySql -> 8.0

问题分析与解决

1. 缺少MySQL容器端口映射

你的docker-compose.yml中,db服务没有将容器的3306端口映射到宿主机,导致宿主机上的Spring Boot无法访问容器内的MySQL服务。Adminer能正常连接是因为它和MySQL容器处于同一个Docker网络中,可以直接通过服务名db访问,而宿主机无法直接访问容器内部端口。

解决方法:在db服务中添加端口映射配置:

db:
  image: mysql:8.0
  command: --default-authentication-plugin=mysql_native_password
  restart: always
  environment:
    MYSQL_ROOT_PASSWORD: MyPassword
  ports:
    - "3306:3306"  # 添加这一行

修改后重启docker-compose:

docker-compose down && docker-compose up -d

2. MySQL root用户访问权限限制

MySQL的root用户默认仅允许从容器内部的localhost访问,宿主机访问时的身份是root@宿主机IP,会被权限规则拒绝。需要授权root用户允许从任意地址访问:

  1. 进入MySQL容器:
docker-compose exec db mysql -uroot -pMyPassword
  1. 执行授权命令:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'MyPassword' WITH GRANT OPTION;
FLUSH PRIVILEGES;

3. Spring Boot数据库连接URL优化

Spring Boot 3.0搭配MySQL 8.0时,建议在URL中添加必要的参数,避免时区、SSL及公钥检索相关的潜在问题:

spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:22:55