You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Docker搭建MySQL服务器时出现Connection refused连接失败问题

解决PHP容器无法连接MySQL容器的问题

这个问题我之前也碰到过,主要是两个常见原因:容器间网络寻址错误,或者PHP缺少必要的数据库扩展。咱们一步步来排查解决:

1. 容器间连接地址错误(最常见原因)

你在PHP代码里用的127.0.0.1:3306是指向PHP容器自身,而不是你的MySQL容器。Docker Compose会自动为所有服务创建一个专属的内部网络,容器之间可以通过docker-compose.yml里的服务名称(也就是voc_mysql)来互相访问,而且要用MySQL容器内部的端口3306(不是宿主机映射的3307)。

修改你的PHP代码里的$servername:

<?php
$servername = "voc_mysql:3306"; // 这里改成服务名+容器内部端口
$username = "root";
$password = "password";

// Create connection
$conn = new mysqli($servername, $username, $password);

// Check connection
if ($conn->connect_error) {
 die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?>

2. PHP容器缺少mysqli扩展

官方的php:apache镜像默认没有安装mysqli扩展,这也会导致连接失败。你可以通过以下步骤安装:

  • 进入PHP容器:
    docker exec -it voc_server bash
    
  • 在容器内安装mysqli扩展:
    docker-php-ext-install mysqli
    
  • 重启PHP容器让扩展生效:
    docker restart voc_server
    

如果想一劳永逸,也可以创建一个自定义的Dockerfile来构建带mysqli扩展的PHP镜像:

FROM php:apache
RUN docker-php-ext-install mysqli

然后修改docker-compose.yml里的voc_server服务,把image换成build: .,这样启动时会自动构建带扩展的镜像。

额外验证步骤

如果还是有问题,可以进入PHP容器测试网络连通性:

  • ping MySQL服务名,看是否能解析:
    docker exec -it voc_server ping voc_mysql
    
  • 用telnet测试端口是否开放:
    docker exec -it voc_server telnet voc_mysql 3306
    

如果这两步都通,那基本就是代码或扩展的问题了。

内容的提问来源于stack exchange,提问作者user3322389

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:26:23