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

Docker部署PHP-Apache+MariaDB+PhpMyAdmin遇数据库及PMA访问问题

问题:PHP-Apache容器无法访问MariaDB表+PhpMyAdmin无权限访问

错误详情

  1. PHP应用抛出数据库表不存在错误:
Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'cinema.movies' doesn't exist in /var/www/html/app/DAO/MovieDAO.php:14 Stack trace: #0 /var/www/html/app/DAO/MovieDAO.php(14): PDOStatement->execute() #1 /var/www/html/app/Controllers/MovieController.php(16): App\DAO\MovieDAO->getAllMovies() #2 /var/www/html/resources/Views/home.php(5): App\Controllers\MovieController->getAllMovies() #3 /var/www/html/index.php(67): include_once('/var/www/html/r...') #4 {main} thrown in /var/www/html/app/DAO/MovieDAO.php on line 14
  1. 访问localhost:8081(PhpMyAdmin)时提示无访问权限。

配置文件

docker-compose.yml

services:
  web:
    image: php:8.2.18-apache
    container_name: cinema
    build: .
    ports:
      - "8080:80"
    environment:
      MYSQL_HOST: $(DB_HOST)
      MYSQL_DATABASE: $(DB_NAME)
      MYSQL_USER: $(DB_USER)
      MYSQL_PASSWORD: $(DB_PASS)
    volumes:
      - .:/var/www/html
    depends_on:
      - db
    env_file:
      - .env
    networks:
      - app-network

  db:
    image:  mariadb:10.4.32
    container_name: database
    restart: always
    environment:
      MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: "1"
      MYSQL_HOST: $(DB_HOST)
      MYSQL_DATABASE: $(DB_NAME)
      MYSQL_USER: $(DB_USER)
      MYSQL_PASSWORD: $(DB_PASS)
      MARIADB_AUTO_UPGRADE: "1"
    volumes:
      - db_data:/var/lib/mysql
      - ./cinema.sql:/docker-entrypoint-initdb.d/cinema.sql
    env_file:
      - .env
    networks:
      - app-network

  phpmyadmin:
    image:  phpmyadmin:5.2.1
    container_name: phpmyadmin
    restart: always
    environment:
      PMA_HOST: $(DB_HOST)
      PMA_USER: $(DB_USER)
      PMA_PASSWORD: $(DB_PASS)
    ports:
      - "8081:80"
    depends_on:
      - db
    env_file:
      - .env
    networks:
      - app-network

volumes:
  db_data:

networks:
  app-network:
    driver: bridge

Dockerfile

FROM php:8.2.18-apache

WORKDIR /var/www/html

RUN apt-get update && apt-get install -y \
    curl \
    git \
    zip \
    unzip \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    libonig-dev \
    libxml2-dev \
    libzip-dev && \
    docker-php-ext-configure gd --with-freetype --with-jpeg && \
    docker-php-ext-install -j$(nproc) gd && \
    docker-php-ext-install -j$(nproc) mysqli pdo pdo_mysql && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \
    apt-get install -y nodejs && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

RUN node -v && npm -v

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

COPY composer.json composer.lock ./
COPY package.json package-lock.json ./

RUN COMPOSER_ALLOW_SUPERUSER=1 composer install
RUN npm install

COPY . .

EXPOSE 80

已尝试操作

曾遇到SQLSTATE[HY000] [2002] No such file or directory错误,通过为db服务添加db_data卷并修改.env中的数据库主机参数解决。


解决方案

一、解决MariaDB表不存在问题

  1. 重置数据库卷(强制重新执行初始化脚本)
    MariaDB的db_data卷如果已存在,会跳过/docker-entrypoint-initdb.d/下的初始化脚本。执行以下命令清理旧卷并重建容器:
docker-compose down -v
docker-compose up -d --build
  1. 检查初始化脚本cinema.sql的正确性
    确保脚本包含以下逻辑:
  • 先创建目标数据库(如果不存在)
  • 切换到该数据库
  • 创建movies表
    示例:
CREATE DATABASE IF NOT EXISTS cinema;
USE cinema;

CREATE TABLE IF NOT EXISTS movies (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    -- 其他字段...
);
  1. 确认数据库连接参数
    检查.env文件中的DB_HOST值应为db(即docker-compose中db服务的名称,而非容器名database),同一Docker网络内通过服务名访问容器更可靠。

二、解决PhpMyAdmin无权限访问问题

  1. 为数据库用户添加远程访问权限
    在cinema.sql中添加授权语句,允许用户从任意主机访问:
GRANT ALL PRIVILEGES ON cinema.* TO '${DB_USER}'@'%' IDENTIFIED BY '${DB_PASS}';
FLUSH PRIVILEGES;

替换${DB_USER}和${DB_PASS}为实际的环境变量值,或直接写死(如果不需要动态替换)。

  1. 调整PhpMyAdmin的环境变量
    确保PMA_HOST值为db(服务名),若仍有问题,添加PMA_ARBITRARY=1允许连接任意数据库主机:
phpmyadmin:
  # ...其他配置
  environment:
    PMA_HOST: db
    PMA_USER: $(DB_USER)
    PMA_PASSWORD: $(DB_PASS)
    PMA_ARBITRARY: 1
  1. 验证端口与网络
  • 确认本地8081端口未被其他程序占用
  • 检查PhpMyAdmin容器是否正常启动:执行docker logs phpmyadmin查看日志,排查连接错误。

内容的提问来源于stack exchange,提问作者Flavio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:00:56