PHP mysqli可以';t连接到在Docker中运行的MySQL 8.0.16

PHP mysqli可以';t连接到在Docker中运行的MySQL 8.0.16,php,mysql,docker,mysqli,mysql-8.0,Php,Mysql,Docker,Mysqli,Mysql 8.0,摘要: mysql服务器8.0.16正在Docker容器中运行 php 7+Apache2+myslnd 5.0.12+mysqld 5.6.22在Docker外部运行 在PHP中,mysqli失败,因此: mysqli_connect('127.0.0.1', 'test', 'test', 'test', 8016) ERR: 2054 : The server requested authentication method unknown to the client 同时,mysq

摘要:

  • mysql服务器8.0.16
    正在Docker容器中运行
  • php 7+Apache2+myslnd 5.0.12+mysqld 5.6.22在Docker外部运行
在PHP中,mysqli失败,因此:

mysqli_connect('127.0.0.1', 'test', 'test', 'test', 8016)

ERR: 2054 : The server requested authentication method unknown to the client
同时,
mysql
可以从外部Docker进行连接:

问题:如何让
mysqli\u connect
工作

详细信息:

以下是一些相关的拨款项目

mysql> select host, user, db, select_priv, grant_priv
                  from mysql.db where user='test';
+------------+------+------+-------------+------------+
| host       | user | db   | select_priv | grant_priv |
+------------+------+------+-------------+------------+
| 172.17.0.1 | test | test | Y           | N          |

mysql> select host, user, plugin, select_priv, grant_priv
                    from mysql.user where user='test';
+------------+------+-----------------------+-------------+------------+
| host       | user | plugin                | select_priv | grant_priv |
+------------+------+-----------------------+-------------+------------+
| 172.17.0.1 | test | mysql_native_password | N           | N          |
我在docker映像中找到了/etc/my.cnf并启用了它

default-authentication-plugin=mysql_native_password
这使得即使是一个旧的(5.6)
mysql
也可以这样连接:

mysql  -P 8016 -h 127.0.0.1 -u test -ptest test
是的,它的标题包括

Server version: 8.0.16 MySQL Community Server - GPL
命令行
mysql
似乎知道
mysql\u native\u密码
,但是
mysqlnd
没有

更多版本信息:

PHP Version 7.0.33-0ubuntu0.16.04.6
Apache/2.4.18 (Ubuntu) 
phpinfo
谈到了
mysqlnd

Version:         mysqlnd 5.0.12-dev - 20150407 - $Id: b5c5906d452ec590732a93b051f3827e02749b83 $
Loaded plugins:  mysqlnd,debug_trace,auth_plugin_mysql_native_password,auth_plugin_mysql_clear_password,auth_plugin_sha256_password
API Extensions:  mysqli,pdo_mysql 
#docker ps
(显示端口映射):

PHP-CLI也无法连接


(是的,我在适当的时间运行了
FLUSH PRIVILEGES;

您已经尝试在
my.cnf
中设置
默认身份验证插件
-也许可以改为尝试作为
命令
参数来执行?我在尝试身份验证时遇到了类似的问题,但这在我的
docker compose.yml中对我有效-我从未尝试在
my.cnf中设置它

mysql:
    container_name: myapp-db
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    environment:
     (snip)

命令
取自MySQL的Docker docs页面)。

可能与@LinPy重复-谢谢,但我不认为是相同的。请注意,我在Grant表和my.cnf中已经有了
mysql\u native\u密码。此外,mysqlnd似乎能够处理sha2(请参阅phpinfo)。您需要使用
默认身份验证插件
@LinPy重新构建容器-它不是dup。
ALTER
(dup的答案1和3)已经完成。
[mysqld]
设置(Ans 2)已经完成,您是说GRANTs和my.cnf中的设置不够?听起来像个虫子。我只是说什么对我有用。官方的mysql docker映像有一个启动脚本,而不是直接运行mysql-我还没有深入研究它,看看是否有某种机制使它不读取my.cnf文件,对不起。我尝试的第一件事起了作用,所以我继续我的下一个问题……我看不出来它在起作用;你在看哪一页很确定这就是那一页。“command”方法是作为一个示例配置项存在的,但是我的hazy内存中的页面内容有点不同(虽然它肯定在docs.docker.com网站上),从docker安装包无法正常工作令人恼火。我创建了一个类似于你的撰写脚本,并使其正常工作。谢谢
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                  PORTS                               NAMES
99193bedb36c        mysql/mysql-server:8.0.16   "/entrypoint.sh my..."   8 weeks ago         Up 12 hours (healthy)   33060/tcp, 0.0.0.0:8016->3306/tcp   o8016
mysql:
    container_name: myapp-db
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    environment:
     (snip)