Navicat出现无法远程连接Docker运行的MySql服务器问题的解决办法

373 阅读2分钟

之前使用的命令,启动Mysql容器:

docker run --name msql -v /msql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -d mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

出现的效果:

image-20230524233334898.png

navicat使用ip无法连接

解决:

使用下面的,指定端口号:

docker run --name msql -p 3306:3306 -p 33060:33060 -v /msql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -d mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

结果:

image-20230524233440150.png

使用navicat连接成功

原因:

在Docker容器中,端口映射的格式可以是以下两种形式之一:

  1. 0.0.0.0:主机端口号->容器端口号/tcp:这种格式表示将容器内的某个端口映射到主机上的指定端口,并且容器内的服务会绑定到容器的所有网络接口上。通过这种映射方式,可以从主机的所有网络接口上访问容器内的服务,包括本地回环接口(localhost)和主机的所有网络接口(如局域网、公网等)。
  2. 容器端口号/tcp:这种格式表示容器内的某个端口号,但没有指定将其映射到主机的哪个端口。在这种情况下,容器内的服务通常会绑定到容器的默认网络接口上(通常是容器的内部IP地址),并且只能从容器内部或通过Docker网络进行访问,无法通过主机的网络接口直接访问。

因此,对于第一种形式的端口映射,可以通过主机的IP地址和映射的端口号从主机及其他局域网内的计算机访问容器内的服务。而对于第二种形式的端口映射,只能在容器内部或通过Docker网络进行访问。

出问题的情况下,MySQL容器的端口映射为3306/tcp, 33060/tcp,没有显示为0.0.0.0:端口号->端口号/tcp的形式。这意味着MySQL服务已经绑定到了容器内的所有网络接口上,但没有映射到主机的指定端口上。因此,只能在容器内部或通过Docker网络进行访问MySQL服务,而无法直接通过主机的网络接口访问。