场景:为了模拟某项目的环境,且mySQL版本过低,本地使用的是8.0,需要5.0的,所以本地再部署一个。
1、拉取镜像,docker pull mysql5.7
2、在本地系统下,创建三个文件夹,分别是log 、conf、 data,同时需要在conf文件夹下创建my.cnf文件。
PS:mysql在5.0.17之后,不再提供my.cnf文件,但是可以自己创建。
创建三个文件夹的目的是将其进行挂载
XML
docker run -d --rm --name mysql5.7
-v D:\docker\mysql\log:/var/log/mysql
-v D:\docker\mysql/data:/var/lib/mysql
-v D:\docker\conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=123456
-p 6306:3306
-d mysql5.7
PS:
1、Windows下,执行长命令的时候,不要回车 加 " \ " ,windows识别不了,简单粗暴的方法及时直接将回车删掉。
2、-p 为端口映射,意思为将宿主机6306的端口映射到容器3306端口上【前提该服务确实是在3306端口启动的,否则你通过Navicat等工具无法连接上,但是mySQL服务能否启起来和-p配置无关系】
3、进入数据库,docker exec -it mysql5.7 bash
可以通过输入mysql -uroot -p123456 -e "show variables like 'character_set_server'"; 来查看你的my.cnf是否被正确读取了,默认是latin1,如果发现是这个,就要排查一下挂载是否正确。

我的my.cnf文件内容如下:
XML
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
init_connect="SET collation_connection = utf8mb4_unicode_ci"
init_connect="SET NAMES utf8mb4"
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-name-resolve
老生常谈:有的人说需要额外配置一下 root 的localhost 改成 % ,这里统一说一下,mysql5.7 是不需要配置的,docker run后,就支持远程连接。
可以通过进入mysql数据库, select Host,User from User; 发现root 已经是 % 了。
一个大坑:
由于本地启了多个mySQL服务,当时想着端口冲突,其中一个写了 -p 3306: 3306 ,另一个写了 3307:3307 ,导致3307的服务docker中是成功运行的,但是通过Navicat远程连接的时候一直连不上,后面将3306的那个服务关了之后,将3307的改成3306后,能成功脸上,恍然大悟.... 端口映射写错了。
前者是暴露在宿主机上的,即windows上,如果有多个服务,这个确实是要变动的。
后者是暴露在容器内的,每个容器是独立的,所以写一样的也没任何关系,他们之间没有联系,如果你写了3307,请确保你的服务确实是在该容器的3307端口运行的,否则报错:
2013 - Lost connection to MYSQL server at 'waitting for initial communication packet System error.