Docker容器环境下PHP连接MySQL的实现与调试

许南星
许南星
发布时间:2026-10-13 | 2人浏览过
原创

在微服务与容器化架构中,PHP应用常需连接独立的数据库容器。本文详述如何构建支持MySQL扩展的Docker镜像,并通过配置容器网络(如旧版--link或新式Docker Network)实现PHP容器访问MySQL容器,附带完整的PHP连接测试脚本。

操作目标

在 Docker 环境中部署运行 PHP CLI 脚本的应用,使其能够通过主机名正确连接同一网络下的 MySQL 数据库容器,完成基本的数据库读写操作。

准备条件

需要宿主机安装 Docker 环境。为简化演示流程,假设已经存在一个正在运行的 MySQL 容器(例如名为 mysql-server-1 的实例),其默认用户为 root,密码为 password,且存在待查询的数据库 test。

真实操作顺序

第1步:构建带有数据库扩展的 PHP 基础镜像

目的:标准官方 PHP 镜像通常不包含所有数据库驱动,需手动编译安装 pdo_mysql 等扩展。

入口/动作:在工作目录下创建一个名为 Dockerfile 的文件,写入以下定义内容:

FROM php:7.0-cli
MAINTAINER Terry Zhang <zterry@qq.com>
RUN docker-php-ext-install pdo_mysql mysqli

说明:基于轻量级的 php:7.0-cli 版本进行定制,并使用 docker-php-ext-install 内置指令激活 PDO 和 MySQLi 拓展。

第2步:编译生成本地镜像

目的:将上述 Dockerfile 转换为可执行的镜像。动作:在终端输入编译指令:

docker build -t php-mysql .

注意:请确保 -t 后面的名称(如 php-mysql)符合您的命名习惯;若目录中有 Dockerfile,最后必须加上句点 . 表示当前上下文。

第3步:编写 PHP 数据库测试脚本

目的:创建一个可在命令行下执行且能自动识别主机名的 PHP 文件。动作:新建文件 mysql.php(路径随挂载卷决定),填入以下内容:

<?php
$host = 'mysql'; // 此主机名取决于启动时的参数设置
$user = 'root';
$pwd = 'password';
$db = 'test';

// 建立连接
$mysqli = new mysqli($host, $user, $pwd, $db);

if ($mysqli->connect_errno) {
    echo "Errno: " . $mysqli->connect_errno . "\n";
} else {
    // 执行 SQL 语句读取数据
    $sql = 'SELECT * FROM users';
    if ($res = $mysqli->query($sql)) {
        while ($row = $res->fetch_assoc()) {
            print_r($row);
        }
    }
}
?>

第4步:运行 PHP 容器并建立连接

目的:启动 PHP 容器,将其挂载本地工作目录以执行刚编写的脚本,并将其加入与 MySQL 容器的通信网络。

关键参数解析:

  • -v (pwd):/var :将宿主机当前目录映射进容器内部路径 /var,使容器内可直接读取外部脚本。
  • --link my-mysql-server1:mysql :这是关键步骤。该参数允许 PHP 容器直接访问名为 my-mysql-server1 的目标容器,并在 PHP 容器内部自动生成别名 mysql。**注意:**在较新的 Docker 版本中推荐使用自定义网络代替 --link,但若沿用旧例,务必保证此处的主机名字符串与脚本中 $host 变量一致。

动作:执行如下命令:

bash docker run -it --rm -v $(pwd):/var --link my-mysql-server1:mysql php-mysql:latest php /var/mysql.php

完成判断与排错验证

如果执行输出中能看到由数据库返回的数组数据打印在终端,则证明链路畅通。若遇到连接失败,可通过以下方式进行诊断:

验证主机名可达性:
利用同样的基础镜像单独启动一个容器,在控制台对预期主机名发起连通性探测(Ping):

docker run -it --rm php-mysql ping mysql

若能成功收到回包,说明 DNS 或服务发现机制(即 --link 生效)正常;若报错 “Unknown host”,请检查 --link` 后的目标容器 ID/名称是否正确书写,以及宿主机防火墙是否拦截了端口。

简要总结

以上就是基于 Docker 让 PHP 调用 MySQL 数据库的详细内容,更多关于 Docker 环境开发与容器间通信的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表