Navicat连接Docker中的MariaDB失败,主因是端口未映射、MariaDB未启用远程访问(bind-address=0.0.0.0及root@'%'授权)、宿主机防火墙或云安全组未放行对应端口。
Navicat 连接 Docker 中的 MariaDB 为什么连不上?
绝大多数连不上,是因为三个环节没打通:容器端口没映射出来、mariadb 没允许远程访问、宿主机防火墙/安全组拦住了。不是 navicat 配置错了,而是底层链路断在了中间。
docker run 启动时必须加 -p 映射 3306 端口
启动容器时不显式映射端口,Navicat 就根本接触不到 MariaDB。别信“默认就通”的说法。
-
docker run -d --name my-mariadb -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mariadb是最简可行命令 - 如果宿主机 3306 已被占用,可换端口,比如
-p 3307:3306,但 Navicat 连接时端口要填3307 - 别用
--network host方式启动——它绕过 Docker 网络栈,在多数云服务器上反而导致端口不可达
必须改 MariaDB 的 bind-address 和 root 权限
即使端口映射了,MariaDB 默认只监听 127.0.0.1,外部连接会被直接拒绝。错误信息通常是 Host 'xxx.xxx.xxx.xxx' is not allowed to connect to this MySQL server。
- 进入容器执行:
docker exec -it my-mariadb mysql -uroot -p,输密码后运行: USE mysql; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456'; FLUSH PRIVILEGES;- 编辑配置文件(路径通常是
/etc/mysql/my.cnf或/etc/mysql/mariadb.conf.d/50-server.cnf),在[mysqld]下加一行:bind-address = 0.0.0.0 - 重启容器:
docker restart my-mariadb
Navicat 连接参数怎么填才不报错
填错 Host 或 Port 是高频失误点。尤其注意:Host 填的是宿主机 IP,不是容器 IP,也不是 localhost(除非你在宿主机上跑 Navicat 且用 127.0.0.1)。
- Host:填你服务器的公网 IP 或内网 IP(如
192.168.1.100),不是localhost,也不是docker inspect my-mariadb | grep IPAddress输出的那个 - Port:填
-p参数左边的端口(宿主机端口),比如-p 3307:3306就填3307 - Username:
root(或你创建的其他用户) - Password:和
MYSQL_ROOT_PASSWORD一致 - 如果服务器开了防火墙(如
firewalld或云厂商安全组),必须放行你填的 Port(如3307),不是容器内那个3306
最容易被忽略的是安全组——哪怕所有配置都对,云服务器控制台里没开对应端口,Navicat 就永远卡在“正在连接…”。务必确认这一步是手动勾选并保存过的。


















