You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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_db
  • MYSQL_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 05:00:41