从宿主机连接Docker部署的MySQL遇权限拒绝错误,求解决办法
解决宿主机连接Docker中MySQL的权限问题
这个问题我之前也碰到过,核心是MySQL的用户权限限制在搞鬼,我来一步步帮你搞定:
问题根源
你已经通过docker run把宿主机的13306端口映射到了容器的3306端口,但MySQL 5.6的root用户默认只允许从容器内部的localhost登录。当你从宿主机发起连接时,MySQL会把这个请求识别为来自外部主机(哪怕你用的是localhost,实际走的是TCP/IP而非容器内的socket),所以直接触发了权限拒绝。
快速临时修复(只需操作一次)
虽然你提到不想用docker exec进入容器,但这一步是一次性的,做完之后就能正常从宿主机连接了:
- 先进入容器的命令行:
docker exec -it mysql bash - 在容器内登录MySQL,输入你设置的密码
pass:mysql -u root -p - 授权
root用户允许从任意主机访问,然后刷新权限:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'pass' WITH GRANT OPTION; FLUSH PRIVILEGES; - 输入两次
exit退出MySQL和容器命令行。
现在回到宿主机,用这条命令重新连接(推荐用127.0.0.1而非localhost,避免socket连接的干扰):
mysql -u root -p -h 127.0.0.1 -P 13306
输入密码pass就能成功连接了。
永久解决方案(启动容器自动配置)
如果不想每次创建容器都手动授权,可以通过挂载初始化脚本让容器启动时自动完成权限配置:
- 在宿主机创建一个
init.sql文件,内容如下:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'pass' WITH GRANT OPTION; FLUSH PRIVILEGES; - 用这条命令启动容器(把脚本挂载到MySQL的初始化目录):
docker run -p 13306:3306 -d \ -e MYSQL_ROOT_PASSWORD="pass" \ -e MYSQL_DATABASE="db" \ -v $(pwd)/init.sql:/docker-entrypoint-initdb.d/init.sql \ --name mysql mysql:5.6.46
容器启动后会自动执行init.sql里的命令,你直接在宿主机用mysql -u root -p -h 127.0.0.1 -P 13306连接即可。
额外小提示
- 如果你坚持要用
localhost连接,可以在命令里加上--protocol=tcp强制使用TCP/IP,避免客户端优先用unix socket:mysql -u root -p -h localhost -P 13306 --protocol=tcp - 注意:授权
root从任意主机访问(%)在生产环境有安全风险,生产场景建议限制为宿主机的具体IP,比如'root'@'192.168.1.100'(替换成你的宿主机实际IP)。
内容的提问来源于stack exchange,提问作者Andy Kim
相关产品推荐
相关产品推荐

