Docker部署的Keycloak配置远程MySQL服务器遇权限拒绝问题求助
你遇到的Access denied for user 'keycloak'@'<host_ip>'错误,虽然已经做了授权操作且本地Workbench能正常连接,但Docker容器里的Keycloak还是连不上远程MySQL,咱们可以从以下几个方向逐一排查:
授权配置未生效或存在冲突
你执行了GRANT ALL ON keycloak.* TO keycloak@'%' IDENTIFIED BY 'dbuserpassword';后,有没有执行FLUSH PRIVILEGES;?MySQL需要手动刷新权限表才能让新的授权规则生效,这是很容易漏掉的步骤。
另外,登录远程MySQL执行SELECT user, host FROM mysql.user WHERE user='keycloak';,确认host列确实是%——有时候重复创建用户会导致实际生效的授权规则不是你预期的通配符。环境变量密码与MySQL实际密码不匹配
注意看你的Docker命令里MYSQL_PASSWORD=password,但授权语句里设置的密码是dbuserpassword,这两个必须完全一致!如果密码不对,哪怕授权再正确也会报权限错误,这个细节一定要核对清楚。远程MySQL的绑定地址限制
检查远程MySQL的配置文件(比如/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),确认bind-address设置的是0.0.0.0(允许所有IP访问)。如果它被设为127.0.0.1,那只有远程服务器本地能访问,哪怕Workbench能连也可能是配置临时变动过,最好再确认一遍。防火墙/安全组的流量限制
虽然本地Workbench能连,但Docker容器的网络流量路径和本地主机略有不同:默认情况下Docker容器通过主机NAT出站,源IP是你的Ubuntu主机IP,但也有可能被主机或远程服务器的防火墙拦截。- 先检查远程服务器的安全组/防火墙,确认是否允许你的Ubuntu主机IP访问3306端口;
- 临时关闭Ubuntu本地的UFW防火墙试试:
sudo ufw disable,如果关闭后能连接,再针对性地添加允许Docker流量的规则。
Docker网络模式的影响
试试用主机网络模式启动Keycloak容器,让它直接复用主机的网络栈,和你本地Workbench的网络环境完全一致:docker run --network host \ -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin \ -e DB_VENDOR=MYSQL \ -e DB_ADDR=<IP_ADDRESS> \ -e DB_PORT=3306 \ -e MYSQL_DATABASE=keycloak \ -e MYSQL_USERNAME=keycloak \ -e MYSQL_PASSWORD=你的正确密码 \ jboss/keycloak如果用
host网络能成功连接,说明是Docker桥接网络的路由或规则限制问题,后续可以排查Docker的IPtables配置或自定义网络设置。MySQL认证插件兼容性问题
如果你用的是MySQL 8.0及以上版本,默认的认证插件是caching_sha2_password,而jboss/keycloak镜像里的JDBC驱动可能不支持这个新插件,导致认证失败。
登录远程MySQL执行SELECT user, plugin FROM mysql.user WHERE user='keycloak';,如果插件是caching_sha2_password,改成旧的兼容插件:ALTER USER 'keycloak'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者Sulthan

