相关推荐recommended
虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql
作者:mmseoamin日期:2023-12-18

文章目录

一、问题引入

二、问题分析 

三、问题解决 

​四、总结


一、问题引入

今天是学习谷粒商城的第一天,既然是第一天,肯定就是先对项目先有个基本的了解,比如是项目所用到的技术栈,项目整体的架构等,还对分布式的相关概念简单说了一下。

接下来来就是搭建环境了,与以往不同的是,先是从运维搭起,也就是先装虚拟机,然后在虚拟机上装相关软件,比如说Docker、Mysql、Redis。当然雷神他上课不是用到Vmware虚拟机,而是另外一个虚拟机平台,virtualBox,并且使用vagrant快速集成centos,然后使用windows的cmd进行操作。本来还想试一下的,可是因为要安装centos,下载的真的很慢,并且VMware+Xshell也挺好用的,我就在WMware上面另外又搭建了一台Linux系统。然后就是正式配环境了,使用Docker容器技术安装相关软件。

首先就是安装MySql,当我pull下来,然后run之后,并且ps了一下,发现MySql容器已经启动了,然后用Navicate连了一下,发现怎么也连不起来,报错如下:

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第1张

二、问题分析 

说句实话,看到这个我的第一反应是,IP地址是不是写错了或者是虚拟机防火墙开着,不允许外界访问啥的,可是我看IP没错,防火墙也被我关了。是的,我比较菜,之后就想不到什么了,之后使用Docker的ps命令发现MySql已经restart了,所以是启动出了问题,我就开始怀疑是不是我那个run的那一长串是不是写错了,最开始,我在记事本上面手写了一遍,确实最开始的时候,我写的确实有问题,问题出在目录挂载那里,前面写错,没有以/开头,后面也写错了,先mysql,报错如下:

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第2张

 看到最后我知道要使用绝对路径,改了之后确实也启动了,

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第3张

随即我就使用navicat连,发现连不上,后面就一直restarting:

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第4张  后面我就傻不拉几的把容器删了重启,还以为自己的那个不对,还改成了和老师一样的写法,就是把我的那个开机自启(restart=always)去掉了,来来回回重复了好几遍,最后我把镜像都删了,重置,最后也是没能解决问题(确实这里是犯傻了,其实我最开始启动了,最开始UP了说明那一长串其实是没问题的,我还一直纠结这个),后面没办法了咯,只能在网上查了咯,搜索的关键字是:Navicat连不上虚拟机里面使用docker安装的MySql,看到的结果有下面这些:

1. MySQL服务是不是正常开启了

到Docker这里就是容器是否启动成功了呗,确实我的容器就没启动成功

2. MySQL未远程授权

确实这也是一个问题,当时根本没在乎这里,没这种意识

3. 虚拟机防火墙的问题,未开放端口啥的

我把防火墙关了,所以问题肯定不是在这

排错方法如下:

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第5张


虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第6张

首先明确容器就启动失败,得先从容器这里入手:

后面我换了之前学Docker的时候成功的run命令:

结果这样:

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第7张

我滴个妈呀,这到底咋回事呀,之前都好好的,现在就出一些问题呢,(ps:其实这里报错有显示my.cnf的事,我没太在意,最后问题确实也很这里有关系) 。

反正目前是启动都失败,还不要先管其它的,先把它正常启动再说,后面我找到了一篇博客,解决了我的问题:

他说既然你没启动,那就看容器的日志的报错信息(ps:确实这点我有问题,没有查看容器错误日志的这种意识)。

日志的报错信息如下:

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第8张

解决办法是:我的宿主机的conf目录,下面得配置my.cnf文件,文件里面写东西,就是在conf目录下,创建一个my.cnf的文件,文件里面写下面这些:

[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
 
[client]
default-character-set=utf8
 
[mysql]
default-character-set=utf8

也就是这篇博文

(20条消息) docker的mysql容器exited(1)无法正常启动_敲着bug的小熊的博客-CSDN博客 

 重新启动容器,发现也一直是UP状态了,说明启动成功:

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第9张

 启动是成功了,可是我的navacat依旧是连不上。

然后下面这篇博文就说,要改密码,反正他改了密码就行了:

(20条消息) docker安装mysql后Navicat链接不上的问题_小城南的博客-CSDN博客

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第10张

后面我就使用exec命令进入到MySQL容器里面。(ps:这里我又傻了一下,进入到容器里面就这个use user了这个使用mysql命令了,其实还没有连接上MySql客户端呢,当然通过这个我也更加理解了一个Docker容器其实相当于就是一台虚拟机,在这里就是装有MySql的一台虚拟机,这里联想到挂载目录,其实也想得明白了,容器中的/var然后再/mysql,不就相当于一台Linux吗)。

好,接下来问题又来了,使用密码登录MySql客户端居然连不上了,这是我在以前从未出现过的问题,报错如下:

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第11张

 我滴个妈,这又是咋回事呀,怎么我是设置了密码启动的,怎么还连接不上了,没办法咯,之前也没遇到过,继续百度咯,后面看到下面这篇博文:

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第12张

说不需要使用密码,直接回车,然后改一下密码,然后再重新设置密码,最后重新启动MySql,最后再重新登录就行了。

下面是这篇博文地址:

(20条消息) 解决mysql:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: NO/YES)_刀光剑影aaa的博客-CSDN博客 最后我试了试,确实可以直接回车进行登录:

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第13张

可能是博主多写了把,其实这里是没有password的,修改密码直接是:

update user set authentication_string = '123456' where user = 'root'

修改为然后flush一下:

flush privileges;

那到底怎样解决密码问题呢?后面我又看了另外的一篇博文:

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第14张 这是修改root密码的方法

下面是这篇博文地址:

(20条消息) MySQL修改root用户密码_mysql修改密码命令_折竹丶的博客-CSDN博客

这篇博文确实挺好的值得推荐,提供了修改root用户密码的方式,还提供了忘记密码和知道密码的两种方式修改密码的方法。

按照他的步骤我确实修改密码成功了,使用新密码登入客户端成功:

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第15张

 好了,按照之前博文所说的,修改密码之后,应该navacat现在应该可以正常连接上了吧,结果却还是连接不上。

后来我又看到一篇博文说要改一下这个,如下图所示,这样改一下密码就行了:

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第16张

 结果都是这个报错;

Operation ALTER USER failed for 'root'@'%'

然后我又继续查看博文,下面的博文解决了我的问题

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第17张

这是博文地址:(20条消息) ERROR 1396 (HY000): Operation ALTER USER failed for ‘root‘@‘localhost‘_Mr.Java.的博客-CSDN博客

按照他之前所说的,我得先有'root'@'%'后面我使用下面这条语句将其修改成这个:

update user set host ='%' where user='root';

修改之后结果是这样:

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第18张

 还是不行,所以我就只能按照他所说的还是不行的方法:

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第19张

 先置密码为空,然后重新设置密码;

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第20张

最终使用navicate连接成功!!!

后面我又测试了一下,将其将root用户的host修改为localhost,结果确实连不上,最后还是重新修改成%然后再使用上面两步重置密码解决。

三、问题解决 

 1. 首先解决MySql容器无法启动的问题:

在宿主机的conf目录下面配置这个:

​
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
 
[client]
default-character-set=utf8
 
[mysql]
default-character-set=utf8
​

2. 客户端使用密码无法登录

使用下面方法重置root账号密码:

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第21张

 

 3. 如果还有问题,试一下这个

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第22张

 如果尝试这个的时候报了下面这个错:

Operation ALTER USER failed for 'root'@'%'

就先这样让'root'的host为'%':

update user set host ='%' where user='root';

重新尝试上面那个,如果还是有问题,直接下面这样:

虚拟机使用docker安装MySql出现的问题,Navicat连不上MySql,第23张 四、总结

1. 首先要有查看容器的日志的报错信息的意识,这一点我是没有意识的,后面是通过查看日志,才知道是my.cnf没有配置的问题,配置了MySql容器就可以正常启动了

2. 知道如果客户端使用密码登不进,尝试是否可以直接回车进去,进去之后修改密码

方法是

2.1 先切换到mysql数据库,将密码置为空

2.2 然后设置加密规则,重新设置密码,并进行授权

3. 要有navicat连不上MySql可能是root用户的host是localhost的缘故的这种意识,也就是是否支持远程连接,知道使用 update user set host ='%' where user='root';这条命令进行修改。