使用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
相关产品推荐
相关产品推荐

