问题:
宿主机和虚拟机互相可以ping通,但在Docker中启动mysql容器后,宿主机无法通过虚拟机ip和端口号连接虚拟机数据库
初始环境:
ubuntu系统
mysql容器端口号3306
解决:
1.设置mysql外部可访问
mysql默认只能本机访问,需要将其设置为外部可访问。
首先进入mysql容器
#进入mysql容器
docker exec -it mysql mysql -u用户名 -p密码
#切换数据库
use mysql
#显示当前用户
select user,host from mysql.user;
#创建一个用户和密码 设置访问权限为%
create user '用户名'@'%' identified with caching_sha2_password by '密码';
#设置允许访问的数据库 这里是全部
GRANT ALL PRIVILEGES ON *.* TO '用户名'@'%' WITH GRANT OPTION;
# 刷新
FLUSH PRIVILEGES;
退出后重新启动mysql容器。
注意一个是caching_sha2_password是mysql新版本的插件,对应老版本的mysql_native_password,可以通过show plugins查看mysql的插件及其状态。如果插件错误可以看看是不是没启动。
设置完成后,mysql就具有外部访问的权限了,下面设置虚拟机网络配置。
2. 我的VM虚拟机的网络设置默认为仅主机和NAT模式,需将网络设置为桥接模式。
3. 查看虚拟机和宿主机的IP
虚拟机可以用ifconfig命令查看,其中ens网卡对应的是虚拟机ip
宿主机可以用命令行ipconfig查看,也可以在设置-网络中查看ipv4地址
此时可以先尝试看能否相互ping通。
如果ping不通,关闭防火墙。window关闭系统防火墙,Ubuntu系统关闭ufw防火墙。
4.宿主机连接
我用的是DBeaver,也可以用其他数据库管理工具。输入虚拟机ip、mysql容器映射的端口号以及之前创建那个有外部访问权限的用户名、密码。然后就可以测试连接是否成功。
我这里是报了一个错误,需要在驱动属性里将这一选项设为true。
然后就大功告成了!
题外话一句,环境配置果然是一项需要耐心的工作,细致和心态很重要。