Docker环境下PHP5.6+Yii1连接MySQL8.3失败求助
PHP5.6+Yii1+Docker+MySQL8.3 数据库连接失败解决方案
核心问题排查与修复步骤
1. 修正连接字符串的服务名拼写与冗余参数
你的Docker Compose中DB容器名称是yktoo-db,但连接字符串里写的是host=yktoodb(少了一个字母o),这是容器间DNS解析失败的直接原因。同时,Docker容器间通过TCP网络通信,不要同时指定host和unix_socket——app容器无法访问db容器内部的socket文件,直接移除该参数。
修正后的Yii数据库配置:
'db'=>array( 'connectionString' => 'mysql:host=yktoo-db;port=3306;dbname=phpmyadmin', 'emulatePrepare' => true, 'username' => 'xxx', 'password' => 'xxx', 'charset' => 'utf8', ),
2. 适配MySQL8.3的认证插件
PHP5.6的PDO MySQL扩展不支持MySQL8.0+默认的caching_sha2_password认证插件,需将数据库用户切换为mysql_native_password:
- 进入DB容器执行命令:
docker exec -it yktoo-db mysql -uroot -pxxxx
- 执行SQL修改用户认证方式(替换
xxx为你的实际用户名和密码):
ALTER USER 'xxx'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx'; FLUSH PRIVILEGES;
3. 确保PHP容器安装PDO MySQL扩展
PHP5.6的Docker镜像默认可能未安装pdo_mysql扩展,需在Dockerfile-app中添加安装命令:
RUN docker-php-ext-install pdo_mysql
4. 网络连通性验证
如果仍无法连接,在app容器内执行以下命令排查:
- 测试主机名解析:
docker exec -it yktoo-app ping yktoo-db
- 测试端口连通性:
docker exec -it yktoo-app telnet yktoo-db 3306
内容的提问来源于stack exchange,提问作者Franco Val
相关产品推荐
相关产品推荐

