Docker容器环境下PHP连接MySQL的实现与调试
在微服务与容器化架构中,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 环境开发与容器间通信的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









