
本文详解 php 脚本无法连接 mysql docker 容器的典型错误:因用户权限绑定 localhost 而实际连接来源为容器外部 ip(如 10.10.10.10),导致“access denied”;提供完整可运行的修复步骤、安全配置建议及验证方法。
本文详解 php 脚本无法连接 mysql docker 容器的典型错误:因用户权限绑定 localhost 而实际连接来源为容器外部 ip(如 10.10.10.10),导致“access denied”;提供完整可运行的修复步骤、安全配置建议及验证方法。
在 Docker 环境中,MySQL 容器对外暴露端口(如 -p 52000:3306)后,宿主机上的 PHP 脚本并非以 localhost 身份连接 MySQL,而是通过宿主机网络栈发起 TCP 连接,其来源 IP 是 Docker 网络分配给该连接的地址(例如 10.10.10.10)——这正是错误信息中 user01@'10.10.10.10' 的由来。而您此前仅创建了 user01@'localhost',该账户仅允许来自 MySQL 容器内部(即 127.0.0.1 或 ::1)的连接,对宿主机发起的外部连接完全无效。
✅ 正确解决方案:创建匹配来源 IP 的数据库用户
首先,进入正在运行的 MySQL 容器执行授权(注意替换为您的实际容器名):
docker exec -it myMYSQL mysql -u root -ppassword123
然后在 MySQL 提示符下执行以下命令(关键点:使用 '%' 通配符或明确指定宿主机 IP):
-- 方案一(推荐开发环境):允许从任意 IP 连接(需确保网络可控) CREATE USER 'user01'@'%' IDENTIFIED BY 'password123'; GRANT ALL PRIVILEGES ON myDB.* TO 'user01'@'%'; FLUSH PRIVILEGES; -- 方案二(更安全):显式指定宿主机 IP(如已知为 172.17.0.1 或实际网关) -- CREATE USER 'user01'@'172.17.0.1' IDENTIFIED BY 'password123'; -- GRANT ALL PRIVILEGES ON myDB.* TO 'user01'@'172.17.0.1'; -- FLUSH PRIVILEGES;
⚠️ 注意事项:
OpenClaw Docker Setup下载在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- localhost 在 MySQL 中是特殊标识,不等价于 127.0.0.1 ——前者强制走 Unix socket,后者才走 TCP;因此 user01@localhost 对 TCP 连接完全不可见。
- 使用 '%' 时务必限制网络访问范围(如防火墙规则),生产环境应避免开放至公网。
- 若使用 mysql-client-core-5.7,请确认 PHP 的 mysqli 扩展已启用:php -m | grep mysqli。
✅ 修正后的 PHP 脚本(含端口与错误处理)
<?php $servername = "127.0.0.1"; // 宿主机回环地址(经 -p 映射后有效)
$username = "user01";
$password = "password123";
$database = "myDB";
$mysqlPort = 52000; // 显式指定映射端口(注意:类型为整数,非字符串)
// 创建连接(第5参数为端口,第6参数为socket,此处留null)
$conn = mysqli_connect($servername, $username, $password, $database, $mysqlPort);
// 检查连接
if (!$conn) {
$error = mysqli_connect_error();
$errno = mysqli_connect_errno();
die("❌ 连接失败 (Error #$errno): $error");
}
echo "✅ 连接成功!MySQL 版本:" . mysqli_get_server_info($conn) . "\n";
// 可选:验证数据库访问
$result = mysqli_query($conn, "SELECT DATABASE() AS db_name");
if ($result && $row = mysqli_fetch_assoc($result)) {
echo "当前数据库:{$row['db_name']}\n";
}
mysqli_close($conn);
?>
? 验证与调试技巧
-
确认端口映射生效:
docker port myMYSQL 3306 # 应输出 0.0.0.0:52000 telnet 127.0.0.1 52000 # 若连接成功,说明端口可达
-
检查用户权限是否生效:
SELECT User, Host FROM mysql.user WHERE User = 'user01'; SHOW GRANTS FOR 'user01'@'%';
-
避免常见陷阱:
- ❌ 不要修改 bind-address(Docker 官方镜像默认 0.0.0.0,已支持远程)
- ❌ 不要在 PHP 中将端口号写成字符串 "52000"(mysqli_connect 第5参数需整型)
- ✅ 始终用 mysqli_connect_error() 获取具体错误,而非仅依赖 die() 文本
通过以上配置,您的 PHP 脚本即可稳定、安全地连接至 MySQL Docker 容器。核心原则始终是:数据库用户的 Host 字段必须与客户端真实来源 IP 匹配——在 Docker 宿主机场景下,这个 IP 绝非 localhost,而是网络层可见的地址(% 是最简实践)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











