执行命令如下:

docker run -d -p 3306:3306 --name mysql3306 --restart=always --privileged=true -v /myvolume/mysql-master/log:/var/log/mysql -v /myvolume/mysql-master/data:/var/lib/mysql -v /myvolume/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

docker run -d -p 3307:3306 --name mysql3307 --restart=always --privileged=true -v /myvolume/mysql-master/log:/var/log/mysql -v /myvolume/mysql-master/data:/var/lib/mysql -v /myvolume/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

背景说明:

​成功启动第一个mysql实例,进入容器内然后执行登录命令:mysql -uroot -p 是可以成功访问连接mysql的,当启动第二个mysql实例的时候,进入容器报错如图1,显示Can’t connect to local MySQL server through socket ‘/var/run ,然后执行命令查看日志:docker logs --tail 50 --floow --timestamps mysql3307 报错如图2。​

docker启动mysql多实例连接报错Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’_数据库


如图1

docker启动mysql多实例连接报错Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’_数据_02


如图2

​我的错误原因​​​:
如图2报错纯粹是docker启动2个mysql实例时指向了相同的数据卷,正常应该是启动一个实例指定唯一一个数据卷。
​​​问题:那么为什么会出现这个常识错误呢?​​​ 因为当时在我觉得​​“数据卷”​​只是宿主机为了持久化存储数据的一种方式,所以我会觉得多个mysql实例指向相同的保存路径这个思路没问题呀,但是却忽略的数据库InnoDB是有锁机制的,当一个进程跑第1个mysql实例的时候就已经针对数据卷进行了加锁操作,这样当启动第2个mysql实例的时候,发现怎么都获取不到数据卷文件,因为被第一个实例加锁占用呢,所以就会报如图2的错误。

现实场景中使用应该是不同数据库实例指向不同的数据卷,且不同数据库实例要启动在不同的 服务器上,因为一台服务器跑公司所有项目的多个mysql实例,万一服务器有问题所有mysql都用不了,达不到高性能、高可用的效果。