最近几天在学习一个微服务项目的开发,其中服务器中用到了docker容器去安装mysql等环境。第一次学习的时候一切顺利,但第二天继续学习的时候发现navicat不能连接虚拟机上的mysql数据库了,然后在shell中看到了标题中的错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
然后我仔细回想了第二天的所有操作,打开虚拟机后发现docker并没有启动,然后用了以下命令去启动docker:
systemctl start docker
打开docker后,用了以下命令去查看容器中运行的内容:
docker ps
运行结果见下:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
可以看出,现在容器中没有东西在运行,因此,此时我用了下列命令去运行mysql:
docker run -it mysql:5.7 /bin/bash
再之后的操作和结果如下:
[root@localhost ~]# docker run -it mysql:5.7 /bin/bash
root@15cdff365676:/# mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
这也就遇到了我们标题上提的问题,接下来讲解问题的解决方案。注意:该方案仅针对曾经正常运行过之后再遇到问题的情况,如果第一次启动就遇到了这个问题的需要寻找其它解决方案。
解决办法:
其实在我们重新打开虚拟机并启动docker后,我们可以通过以下命令去查看曾经运行过但现在停止的服务:
docker ps -a
比如我运行过后可以看到以下结果:
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c055de3cfdf6 mysql:5.7 "docker-entrypoint.s…" 36 minutes ago Exited (0) 13 minutes ago mysql
我们可以看到有一个mysql服务被停用了,这也就是我们第一次启动的mysql,我们需要做的是重启这个mysql服务,而不是去开启一个新的服务,我们可以通过以下语句去开启这个镜像:
docker start CONTAINER_ID
开启之后我们再查看容器中运行的服务就可以看到mysql了,之后我们再用以下命令去进入这个镜像:
docker exec -it CONTAINER_ID /bin/bash
之后我们再去正常输入用户名和密码,就可以正常启动mysql了。
删除多余服务
有些朋友遇到这个问题的时候在docker里面已经存在多个mysql服务了,这个时候我们需要通过两个语句来删除这些多余的服务:
docker stop CONTAINER_ID
//以上语句用于停用正在运行的服务,如果服务本身未运行,可跳过此步骤
docker rm CONTAINER_ID
//以上语句用于彻底删除某一服务
通过以上两条语句可以逐一删除多余的mysql服务,只剩下需要的那一个,这个时候我们再去开启这个mysql服务就不会遇到相同的问题了。