Mac上Navicat连MySQL容器应填localhost和宿主机映射端口(如3306),因Docker Desktop for Mac支持该解析;若docker ps未显示端口映射则需重跑容器,且MySQL 8+用户需改认证插件为mysql_native_password以兼容旧版Navicat。

Mac 上 Navicat 连 MySQL 容器:填 localhost 就对了
绝大多数 Mac 用户只需在 Navicat 主机栏填 localhost,端口填映射的宿主机端口(如 3306 或 3307),就能连上。前提是容器启动时用了显式端口映射,比如 docker run -p 3306:3306 mysql:8.0。
host.docker.internal 是 Docker Desktop for Mac 内置的 DNS 名,只在「容器内部」访问宿主机时才有效;Navicat 运行在 macOS 本机,根本用不到它。
- 如果
docker ps输出的PORTS列没有显示0.0.0.0:3306->3306/tcp,说明映射失败,删掉容器重跑 - MySQL 8+ 默认用
caching_sha2_password插件,旧版 Navicat(v16.2 及更早)不兼容,报错Authentication plugin 'caching_sha2_password' cannot be loaded;进容器执行:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES;
Linux / WSL2 下 Navicat 必须填 127.0.0.1,不能填 localhost
Linux 版 Navicat 填 localhost 会走 Unix socket(路径如 /var/run/mysqld/mysqld.sock),但 Docker 容器里的 MySQL 只监听 TCP 端口,不提供 socket 文件——结果就是连接超时或直接拒绝。
正确做法是:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 主机填
127.0.0.1(不是localhost) - 端口填宿主机映射端口,比如
docker run -p 3307:3306,这里就填3307 - 别填容器 IP(如
172.17.0.2),那是 Docker bridge 网络地址,宿主机上的 Navicat 路由不到
SQL Server 和 MongoDB 容器连接要盯死三件事
SQL Server(mcr.microsoft.com/mssql/server)和 MongoDB 容器对连接更敏感,容易卡在基础配置上:
-
SQL Server 密码必须达标:含大小写字母、数字、特殊字符,≥8 位;
YourStrong!Passw0rd是底线,123456会导致容器启动失败 -
端口映射必须写全:SQL Server 默认监听
1433,命令中必须是-p 1433:1433;若宿主机1433被占,改用-p 1434:1433,Navicat 端口就填1434 -
MongoDB 要加
--bind_ip_all:否则默认只监听127.0.0.1,外部连不上;这个参数必须写在docker run命令末尾,不是环境变量
防火墙、权限、-p 参数这三处最容易漏查
90% 的“连不上”问题都出在这三个环节,且它们常同时存在:
-
防火墙拦截:CentOS/RHEL 默认开
firewalld,即使 Docker 写了 iptables 规则,仍可能被拦;执行sudo firewall-cmd --permanent --add-port=3306/tcp && sudo firewall-cmd --reload -
MySQL root@'%' 权限没开:Docker 启动的 MySQL 默认只建
root@localhost,不接受127.0.0.1或远程 IP 的连接;进容器执行:CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; GRANT ALL ON *.* TO 'root'@'%'; FLUSH PRIVILEGES; -
-p参数写错:写成-p 3306是无效的——Docker 会随机分配宿主机端口;必须写成-p 3306:3306或-p 3307:3306
跨平台时最麻烦的不是某一个系统,而是同一个命令在 Mac、WSL2、Linux 服务器上行为不一致;建议把 docker ps 和 docker inspect 当成每次调试的第一步,而不是靠猜。

















