Windows 宿主机访问 VirtualBox 虚拟机中创建的 docker 容器中的 mysql8.0 的数据

时间:2024-06-09 07:05:36

一、场景需求

在开发环境中,一般使用 windows 系统进行开发,但需要在 linux 系统中创建运行 mysql8.0 的 docker 容器中进行测试(win10特定版本或win11才能安装 docker),为了方便还需要在 windows 系统中通过 SQLyog 工具查询 docker 容器中的数据库。

实际场景中未必遇到这种情况,这里仅记录自己实现的过程,以及踩过的坑!

 实现效果:

 二、实现思路

1、由于 linux 系统能更好的支持 docker 容器,所以在windows 安装 virtualBox 虚拟机,virtualBox 安装 linux(centos7版)系统,然后在 centos7 中创建 docker 容器,运行 mysql。

2、在window 上运行 SQLyog 客户端,查询 docker 容器中的数据库 

三、相关步骤及配置

1、安装 VirtualBox 及centos7 系统(略去具体安装方法)

centos7镜像可到阿里云镜像站获取:centos-7-isos-x86_64安装包下载_开源镜像站-阿里云

注意:

①最好使用DVD及Everything版本,否则可能会导致安装虚拟机增强功能失败。我最开始使用MInimal版本,增强功能始终安装不上,折腾了我一下午+一晚上。

②Centos7 安装完成后,将网络的连接方式改为【桥接网卡】,以便宿主机和虚拟机能相互ping通

2、Centos7 中安装 docker(略去具体安装方法)

可参考:Install Docker Engine on CentOS | Docker Docs

注意:官网给出的镜像路径是国外网址,拉取镜像经常超时,所以添加镜像仓库时,最好使用阿里云的镜像仓库路径

//docker 官网的镜像仓库路径
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

//国内用户需要添加阿里云的镜像仓库路径
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3、Centos7 中安装运行 Mysql8 的 docker 容器

以数据卷的形式创建及启动,以便保存 docker 容器中的数据。

docker run --name m1 -e MYSQL_ROOT_PASSWORD=1 -v /root/mysqlData:/var/lib/mysql --privileged=true -d -p 3306:3306 mysql


//--name test 为容器指定一个名称(可替换test为自己喜欢的名称)。
//-e MYSQL_ROOT_PASSWORD=1 设置MySQL的root密码。你应该替换1为你的实际密码。
//-d 使容器在后台运行。
//mysql:latest 是要运行的MySQL镜像和标签(在这里是最新版本) 
//以数据卷的形式,创建并启动mysql容器,容器内的mysql数据不会因为容器的删除而被删除
//-v /root/mysqlData:/var/lib/mysql:将数据卷/root/mysqlData映射到容器的/var/lib/mysql目录
//-p 3306:3306:将容器的3306端口映射到主机的3306端口
//--privileged=true: 使容器内的root拥有真正的root权限,解决挂载目录没有权限的问题

 4、在 docker 容器中新增数据test及表user

5、在 Windows 系统中运行 SQLyog 客户端,连接 docker 容器中的数据库

注意:如果遇到以下错误,则是 SQLyog 版本和docker容器中的mysql版本不匹配的原因。

报错原因:客户端不支持服务器要求的认证协议。这可能是因为客户端版本太旧,不支持服务器所使用的新认证协议。

解决方法:升级客户端版本或创建用户时指定使用旧的认证协议

alter USER 'username'@'hostname' IDENTIFIED WITH mysql_native_password BY 'password';

-- 将 username 改为 root
-- 将 hostname 改为 % 和 localhost
-- 将 password 改为数据库密码

-- 具体sql语句如下:
alter USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1';
alter USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '1';

-- 刷新权限
FLUSH PRIVILEGES;