docker 部署 php 项目时,数据库连接失败可通过以下方法解决:暴露数据库端口;创建网络连接数据库和 php 容器;使用服务发现,在容器内使用数据库名称连接;安装 pdo mysql 扩展;使用环境变量连接数据库。
Docker 部署 PHP 项目时数据库连接失败的解决方法
部署 PHP 项目到 Docker 时,由于容器的隔离特性,项目可能无法连接到外部数据库。针对这一问题,有以下解决方法:
1. 暴露数据库端口
立即学习“PHP免费学习笔记(深入)”;
在 Dockerfile 中,将数据库端口暴露给容器,例如:
EXPOSE 3306
2. 创建网络
使用 Docker 创建一个网络,将数据库和 PHP 容器连接起来,例如:
docker network create my-network
3. 将数据库连接到网络
将数据库容器连接到创建的网络,例如:
docker run -d --name my-database --network my-network -p 3306:3306 mysql
4. 将 PHP 容器连接到网络
将 PHP 容器连接到同一网络,例如:
docker run -d --name my-php --network my-network -v /localpath:/var/www -p 80:80 php:7.4-apache
5. 使用服务发现
使用 Docker 服务发现功能,在容器内部使用数据库名称而不是 IP 地址进行连接,例如:
Docker Compose
version: "3.9"
services:
php:
build: .
volumes:
- ./:/var/www
depends_on:
- database
database:
image: mysql:8.0
Dockerfile
FROM php:7.4-apache
RUN docker-php-ext-install pdo_mysql
ENV DB_HOST=database
ENV DB_USER=root
ENV DB_PASSWORD=password
ENV DB_NAME=mydatabase
PHP 代码
<?php
$dsn = "mysql:host=$DB_HOST;dbname=$DB_NAME";
$user = $DB_USER;
$password = $DB_PASSWORD;
try {
$conn = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo "Database connection failed: " . $e->getMessage();
}
实战案例
假设我们有一个 PHP 项目,需要连接到 MySQL 数据库。数据库容器名为 my-database,PHP 容器名为 my-php。
- 按照上述步骤暴露数据库端口、创建网络并连接容器。
- 在 PHP 容器的 Dockerfile 中,使用 docker-php-ext-install 安装 PDO MySQL 扩展。
- 在 PHP 代码中,使用环境变量连接到数据库。
成功连接后,PHP 项目能够顺利访问 MySQL 数据库。