本地与Docker共存两个MySQL版本时如何连接Docker内的MySQL 8.0.26
报错原因
你遇到的报错:
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
本质是MySQL客户端默认使用Unix Socket方式连接本地服务时,找不到对应套接字文件导致的。你关闭本地MySQL 5.7服务后,宿主机原有的/var/run/mysqld/mysqld.sock文件已被清理,而Docker部署的MySQL 8.0的套接字文件默认仅存在于容器内部,没有映射到宿主机的对应路径,因此用默认连接逻辑会触发该报错。
解决方案
下面给出三种可直接落地的解决方式,按需选择即可:
- 方式1:连接时显式指定TCP协议参数(最便捷,无需修改容器配置)
MySQL客户端识别localhost时默认走Socket连接,你只需要在连接配置中把host改为127.0.0.1、显式指定端口3306,就会走TCP协议连接Docker映射的端口。
命令行连接示例:mysql -uroot -proot -h 127.0.0.1 -P 3306
如果你是用脚本连接,修改数据库配置中的host参数为127.0.0.1即可。 - 方式2:映射容器套接字文件到宿主机(适配原有依赖Socket连接的脚本)
如果你有老脚本必须走Socket路径连接,可以在启动容器时新增目录映射参数,把容器内的套接字目录同步到宿主机:
先停止删除原有容器:sudo docker stop mysqlname && sudo docker rm mysqlname
再用新参数启动:sudo docker run --name=mysqlname --env="MYSQL_ROOT_PASSWORD=root" --publish 3306:3306 -v /var/run/mysqld:/var/run/mysqld -d mysql/mysql-server:8.0.26 - 方式3:直接进入容器内部操作MySQL
如果你不需要在宿主机用本地客户端连接,也可以直接进入容器内部执行数据库操作:sudo docker exec -it mysqlname mysql -uroot -proot
注意事项
MySQL 8.0默认使用caching_sha2_password密码认证插件,如果你用本地MySQL 5.7的旧版本客户端连接,可能会触发认证错误,可通过以下步骤修改认证规则兼容旧客户端:
- 进入容器内的MySQL命令行
- 执行以下SQL语句:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root'; FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者aer-der
相关产品推荐
相关产品推荐

