问题描述
远程登陆docker下的mysql容器失败
解决过程
首先排除防火墙的原因,因为我的ubuntu系统没有启动防火墙,然后想着可能是mysql权限问题,于是进入mysql容器
docker exec -it mysql /bin/bash
进入之后输入 mysql -u root -p ,密码输入错误,一脸懵逼
因为之前在启动容器的时候就设置了环境变量MYSQL_ROOT_PASSWORD=root,按理来说密码应该是root才对,但是密码输入错误,没有搞明白是为什么,通过
docker inspect mysql
发现确实配置成功了
但是仍然登录失败,没搞清为啥,于是想着,直接不输密码enter进去,发现成功了,通过
select host,user,plugin,authentication_string from mysql.user ;
发现确实没有,root用户下好像确实没有设置密码(authentacation_string为空)
于是设置密码,此处@后一定是%,因为要保证所有ip(包括远程ip)都可以通过root用户访问数据库(当然,还要设置权限)
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
结果设置成功,重新通过密码登录成功
开始修改权限(因为一般情况下mysql用户不允许远程连接)
以下语句表示:对于任意ip(%),可以通过root用户访问任何数据库下的任何表(*.*)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
之后用navicat远程登录,一定要用虚拟机上linux系统的ip,不知道可以通过ifconfig查看,确保3307端口在监听状态(咱们这种用docker的在之前启动容器的时候就绑定了3307端口,一般来说该端口都处于监听状态,不放心,可以通过netstat -ano|grep 3307 查看)
ps:博主其实早就走到这步了,但是测试连接的时候就是通不过(又尝试了直接在配置文件(/mydata/mysql/conf/my.conf)里(mysqld下)设置bind-address=“0.0.0.0 port=3307”,还是不行),万念俱灰下,关掉navicat,再操作,成了,咱也不知道为啥,感觉被针对了,很难受