无法使用PHP从主机登录Docker MySQL

时间:2018-12-26 11:11:59

标签: php mysql apache docker

我希望在与MySQL数据库(使用Docker进行容器化)建立连接的主机上运行PHP代码。但是我收到以下错误:

连接失败:MySQL服务器已消失

在主机(Ubuntu 18.04 LTS)上,我安装了以下软件:

PHP 7.2.10(非Docker)
MySQL 8.0.13(Docker)
Apache 2.5.29(非Docker)

我在主机上的程序中使用以下连接字符串:

<?php
 $connection=mysqli_connect('127.0.0.1','vernemq','xyzw','some_db');
 if (!$connection) {
 die("Connection failed: " . mysqli_connect_error());
}
?>

注意:上面的程序是用PHP文件编写的,该文件位于目录/ var / www / html

为便于理解,假设主机的IP地址为172.10.10.15。

当与LAMPP服务器在与主机所在网络相同的另一台计算机(IP地址:172.10.10.16)上运行同一程序时,我可以连接到MySQL服务器。我在另一台机器上运行以下修改后的程序:

<?php
 $connection=mysqli_connect('172.10.10.15','vernemq','xyzw','some_db');
 if (!$connection) {
 die("Connection failed: " . mysqli_connect_error());
}
?>

我甚至可以通过在主机的命令提示符上运行以下命令来连接到主机上的Dockerized MySQL服务器:

$mysql -h 127.0.0.1 -u vernemq -p

在MySQL提示符下运行以下命令将返回以下内容:

mysql> SELECT user, host FROM mysql.user
    -> ;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| root             | %         |
| vernemq          | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
| vernemq          | localhost |
+------------------+-----------+

有什么问题的指针吗?

更新 2019年4月1日 我注意到了以下事情

当我从命令行运行数据库连接文件时,出现以下错误。

Getting following error when running the php file from the command prompt
PHP Warning:  mysqli_connect(): Unexpected server respose while doing caching_sha2 auth: 109 in /var/www/html/db.php on line 2
PHP Warning:  mysqli_connect(): MySQL server has gone away in /var/www/html/db.php on line 2
PHP Warning:  mysqli_connect(): (HY000/2006): MySQL server has gone away in /var/www/html/db.php on line 2
Connection failed: MySQL server has gone away

为此,我使用以下命令将用户身份验证方法从mysql_native更改为caching_sha2

ALTER USER 'vernemq' IDENTIFIED WITH caching_sha2_password BY 'vernemq';

它开始工作。

但是我不想使用caching_sha2身份验证,因为它破坏了另一个使用native_mysql身份验证方法的程序。出路是什么?

1 个答案:

答案 0 :(得分:0)

可能您正在Mac OS上运行,而Docker for Mac不提供docker0接口,因此您需要创建一个网络别名:

sudo sudo ifconfig lo0 alias 10.10.0.10/24

然后尝试使用连接字符串10.10.0.10:3306,它应该可以工作。