正确,docker ps 显示的端口映射必须为 0.0.0.0:3306->3306/tcp 等明确格式;若仅写 -p 3306 则宿主机端口随机分配,navicat 无法确定连接地址,需用 -p 3306:3306 显式映射。
docker ps 显示的端口映射是否正确?
这是 navicat 连不上 docker mysql 最常卡住的第一步。很多人以为 docker run -p 3306 就够了,其实没指定宿主机端口,docker 会随机分配(比如 0.0.0.0:32768->3306/tcp),你根本不知道该连哪个端口。
必须用完整格式:docker run -p 3306:3306 或 -p 3307:3306(后者用于宿主机 3306 被占用时)。
- 运行
docker ps,检查 PORTS 列是否出现类似0.0.0.0:3306->3306/tcp—— 没有就说明映射失败,删容器重跑 - Windows WSL2 用户注意:
localhost指的是 WSL2 内部地址,不是 Windows;此时 Navicat 主机应填host.docker.internal或宿主机真实 IP - Linux 原生 Docker 不支持
host.docker.internal,启动容器时需加--add-host=host.docker.internal:host-gateway
MySQL 用户的 host 和 plugin 是否允许远程连接?
MySQL 8+ 默认只有 root@localhost,且认证插件是 caching_sha2_password,Navicat 16 旧版本(Authentication plugin 'caching_sha2_password' cannot be loaded。
进容器执行:
mysql -uroot -p
然后运行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
- 如果
host是localhost,执行:CREATE USER 'root'@'%' IDENTIFIED BY '你的密码'; GRANT ALL ON *.* TO 'root'@'%'; FLUSH PRIVILEGES; - 如果
plugin是caching_sha2_password,执行:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES; - 改完不重启容器也行,但必须执行
FLUSH PRIVILEGES;,否则权限不生效
Navicat 连接时“主机”字段到底填什么?
不是统一填 localhost,填错直接拒绝连接。取决于你的运行环境:
- macOS/Linux 原生 Docker + Navicat 在同一台机器:填
127.0.0.1(比localhost更可靠,避免 socket 干扰) - Docker Desktop(Win/mac):优先填
host.docker.internal,DNS 解析更稳 - 云服务器(如阿里云/华为云):填服务器公网 IP,并确认安全组放行对应端口(如 3306 或你映射的 3307)
- 通过 SSH 隧道连接:常规页的“主机”填
127.0.0.1,端口填服务器上映射的端口(如-p 5506:3306就填 5506)
连接测试失败时,先别调 SSL 或高级参数
很多用户一上来就勾选 SSL、改字符集、设超时,结果连基础 TCP 握手都通不过。建议严格按顺序验证:
- 用
telnet 127.0.0.1 3306(或你填的端口)看是否能连通 —— 连不通就不是账号问题,是网络或映射问题 - 确认 MySQL 容器里
bind-address没被设成127.0.0.1(Docker 默认监听0.0.0.0,一般不用动) - Navicat 测试连接前,务必先点【测试连接】,成功再点【确定】保存 —— 别让错误配置长期存档
- 如果用的是 MySQL 5.7,
root@'%'通常已存在,重点查 plugin;MySQL 8.0+ 则大概率要手动创建@'%'用户
最易被忽略的其实是容器内用户 host 值 —— localhost 只响应 Unix socket,TCP 连接必须匹配 IP 或 %,这点一旦漏掉,其他所有操作都是白忙。











