写点什么

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

作者:刘大猫
  • 2025-09-16
    黑龙江
  • 本文字数:813 字

    阅读完需:约 3 分钟

执行命令如下:


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。



<center><font color='red'>如图 1</font></center>



<center><font color='red'>如图 2</font></center>


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


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

用户头像

刘大猫

关注

还未添加个人签名 2022-08-23 加入

还未添加个人简介

评论

发布
暂无评论
docker启动mysql多实例连接报错Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’_人工智能_刘大猫_InfoQ写作社区