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

从宿主机连接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就能成功连接了。

永久解决方案(启动容器自动配置)

如果不想每次创建容器都手动授权,可以通过挂载初始化脚本让容器启动时自动完成权限配置:

  1. 在宿主机创建一个init.sql文件,内容如下:
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'pass' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    
  2. 用这条命令启动容器(把脚本挂载到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:16:10