从官网上拉取最新MySQL镜像:
docker pull mysql:latest
创建并运行一个MySQL镜像的容器
docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
即使该容器实例运行失败,也表示它是创建成功的,已经存在
命令参数的解释?
-itd -d: 后台运行容器,并返回容器ID -i: 以交互模式运行容器,通常与 -t 同时使用; -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; --name mysql-test 设置该容器实例的名称标识 -p 3306:3306 映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务 -e MYSQL_ROOT_PASSWORD=123456 mysql 设置 MySQL 服务 root 用户的密码。
如果物理机的已经运行了本地安装的MySQL并占用了3306端口,应该更改为3307或者其他端口
【如果这个容器异常无法使用,直接移除容器重新创建即可】
移除容器实例:
docker rm mysql-test
修改端口设置并重新执行运行命令
docker run -itd --name mysql-test -p 3307:3307 -e MYSQL_ROOT_PASSWORD=123456 mysql
我们访问MySQL容器,需要先进入这个容器:
docker exec -it 容器名称标识 bash
这里刚刚进入MySQL容器马上就退出了
再次启动就报错说容器没有运行
百度得知容器实例是因为Linux内存导致的
使用指令查看内存
free -h
算了玩不了。。。
然后使用TOP命令查看Linux所有进程使用情况:
发现本地安装的MYSQL服务内存占用高的离谱,于是立刻停止服务了
重新创建运行容器实例,这回正常了:
输入密码123456,访问成功:
使用本机的SQLyog访问测试,记住是3307端口
发现错误2003代码:
很可能是因为防火墙没开放这个端口
先退出容器:
防火墙开放3307端口,重启之后再看看
但是还是没有用,可能因为MYSQL8.021版本远程用户需要创建新用户才可以使用
进入容器实例,进入MySQL:
更改加密规则:
ALTER USER 'root'@localhost IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
创建一个远程用户:
CREATE USER 'daizhizhou'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
然后赋予完整权限:
GRANT ALL PRIVILEGES ON *.* TO 'daizhizhou'@'%';
最后刷新权限:
flush privileges;
使用远程账号访问还是不行,但是到这里我才明白是因为之前设置的端口号原因导致的:
删除这个镜像应该使用这个端口配置,因为mysql默认3306端口,配置3307根本无法监听
所以需要由MySQL镜像的3306配置实际端口的3307:
docker run --name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
但是又有新的问题:
这个好解决,回到上面创建新的用户并赋予所有权限,然后刷新权限,访问即可
终于反应过来那个配置的解释的话,这样的话就可以本机mysql和容器mysql共存了