连接到另一个 docker 容器 运行 MariaDB 时 MYSQLI 连接被拒绝

MYSQLI Connection refused when connecting to another docker container running MariaDB

我开始接触 Docker 并且我正在尝试让我的 PHP 应用程序 运行ning 在一个 docker 容器中与 nginx连接到另一个容器 运行ning 中的数据库 运行ning MariaDB。

当我 运行 容器时,我可以毫无问题地从我的计算机连接到数据库(使用 Sequel Pro)但是当我尝试从 PHP 在 nginx 容器中应用 运行ning 我收到以下 mysqli 错误:

Warning: mysqli_connect(): (HY000/2002): Connection refused in >/app/web/php/db-config.php on line 7 Failed to connect to the database, died with error:

出现错误的db-config.php如下:

    define('DB_HOST', '0.0.0.0:3306');
    define('DB_NAME', 'Jumpooling');
    define('DB_USER', 'root');
    define('DB_PASSWORD', 'root');

    $con=mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) or die('Failed to connect to the database, died with error:');

所有 docker-compose.yml 文件内容都在 this 存储库中。

我错过了什么?

我设法在 答案中找到了解决方案。

问题是主机未定义为 IP 地址,而是使用 docker-compose.yml 文件中给定的 link 名称,即 db

最终的db-config.php是,因此:

define('DB_HOST', 'db');
define('DB_NAME', 'Jumpooling');
define('DB_USER', 'root');
define('DB_PASSWORD', 'root');

$con=mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, 3306) or die('Failed to connect to the database, died with error:');

启用服务通信不需要链接 - 默认情况下,任何服务都可以访问该服务名称下的任何其他服务。

链接服务的容器可通过与别名相同的主机名访问,如果未指定别名,则为服务名称。

您应该将端口 container/browser 明确指定为 -p 3306:3306:

docker run --name mysql-container -p 3306:3306 -e MYSQL_ROOT_PASSWORD=secret -d mysql:latest