在Nginx容器中部署MariaDB服务后无法查询数据库数据
解决Docker栈中PHP连接MariaDB报500错误的问题
已经部署了内置PHP的linuxserver/nginx容器,PHP页面服务正常。添加同栈的MariaDB容器后,容器运行正常,但PHP查询数据库时出现500错误:192.168.1.109 can't currently handle this request.
问题代码与配置
PHP数据库查询代码
$pdo = new PDO('mysql:dbname=Jack Daniels;host=mysql', 'test_db', 'My_Pwd', [PDO::ATTR_ERRMODE => PDO::ERRMODE_ALL]); $query = $pdo->query('SHOW VARIABLES like "version"'); $row = $query->fetch(); echo 'MySQL version:' . $row['Value'];
docker-compose.yaml内容
version: "2.1" services: nginx: image: lscr.io/linuxserver/nginx:latest container_name: nginx environment: - PUID=1029 - PGID=100 - TZ=Etc/GMT volumes: - /volume1/docker/database:/config ports: - 8110:80 - 8114:443 restart: unless-stopped mariadb: image: lscr.io/linuxserver/mariadb:latest container_name: mariadb environment: - PUID=1029 - PGID=100 - TZ=Etc/GMT - MYSQL_ROOT_PASSWORD=ROOT_ACCESS_PASSWORD - MYSQL_DATABASE=test_db - MYSQL_USER=Jack Daniels - MYSQL_PASSWORD=My_Pwd #- REMOTE_SQL=http://URL1/your.sql,https://URL2/your.sql #optional volumes: - /volume1/docker/database:/config ports: - 3306:3306 restart: unless-stopped
错误原因与修复方案
1. 数据库名与用户名完全颠倒
docker-compose中配置的是:
MYSQL_DATABASE=test_db→ 实际创建的数据库为test_dbMYSQL_USER=Jack Daniels→ 实际创建的数据库用户为Jack Daniels
但PHP代码里把数据库名和用户名搞反了,导致连接权限验证失败。
2. Docker内部服务名错误
PHP代码中写的host=mysql,但docker-compose里MariaDB的服务名是mariadb,Docker栈内部通过服务名进行DNS解析,因此host必须填写mariadb。
3. PDO错误模式常量无效
PDO::ERRMODE_ALL不是合法的错误模式常量,正确选项为PDO::ERRMODE_EXCEPTION(抛出异常)或PDO::ERRMODE_WARNING(触发警告),使用无效常量会直接引发PHP报错。
4. 数据库名/用户名含空格(可选优化)
Jack Daniels包含空格,虽然可以通过引号包裹规避问题,但数据库对象名带空格极易引发各类兼容问题,建议改为JackDaniels或jack_daniels这类无空格名称。
修正后的代码与配置
修正后的PHP代码(保留原用户名空格)
// 开启错误显示,方便排查问题 ini_set('display_errors', 1); error_reporting(E_ALL); $pdo = new PDO( 'mysql:dbname=test_db;host=mariadb', 'Jack Daniels', 'My_Pwd', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); $query = $pdo->query('SHOW VARIABLES like "version"'); $row = $query->fetch(); echo 'MySQL version:' . $row['Value'];
推荐修正后的docker-compose(移除用户名空格)
version: "2.1" services: nginx: image: lscr.io/linuxserver/nginx:latest container_name: nginx environment: - PUID=1029 - PGID=100 - TZ=Etc/GMT volumes: - /volume1/docker/database:/config ports: - 8110:80 - 8114:443 restart: unless-stopped mariadb: image: lscr.io/linuxserver/mariadb:latest container_name: mariadb environment: - PUID=1029 - PGID=100 - TZ=Etc/GMT - MYSQL_ROOT_PASSWORD=ROOT_ACCESS_PASSWORD - MYSQL_DATABASE=test_db - MYSQL_USER=JackDaniels # 移除空格 - MYSQL_PASSWORD=My_Pwd volumes: - /volume1/docker/database:/config ports: - 3306:3306 restart: unless-stopped
对应PHP代码调整为:
ini_set('display_errors', 1); error_reporting(E_ALL); $pdo = new PDO( 'mysql:dbname=test_db;host=mariadb', 'JackDaniels', 'My_Pwd', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); $query = $pdo->query('SHOW VARIABLES like "version"'); $row = $query->fetch(); echo 'MySQL version:' . $row['Value'];
额外排查建议
- 开启PHP错误显示:添加
ini_set('display_errors', 1); error_reporting(E_ALL);可以直接看到具体错误信息,大幅降低排查难度。 - 测试Docker网络连通性:进入nginx容器执行
ping mariadb,确认同栈服务间网络正常。
内容的提问来源于stack exchange,提问作者PHP Addict
相关产品推荐
相关产品推荐

