Docker部署PHP-Apache+MariaDB+PhpMyAdmin遇数据库及PMA访问问题
问题:PHP-Apache容器无法访问MariaDB表+PhpMyAdmin无权限访问
错误详情
- 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
- 访问
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表不存在问题
- 重置数据库卷(强制重新执行初始化脚本)
MariaDB的db_data卷如果已存在,会跳过/docker-entrypoint-initdb.d/下的初始化脚本。执行以下命令清理旧卷并重建容器:
docker-compose down -v docker-compose up -d --build
- 检查初始化脚本
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, -- 其他字段... );
- 确认数据库连接参数
检查.env文件中的DB_HOST值应为db(即docker-compose中db服务的名称,而非容器名database),同一Docker网络内通过服务名访问容器更可靠。
二、解决PhpMyAdmin无权限访问问题
- 为数据库用户添加远程访问权限
在cinema.sql中添加授权语句,允许用户从任意主机访问:
GRANT ALL PRIVILEGES ON cinema.* TO '${DB_USER}'@'%' IDENTIFIED BY '${DB_PASS}'; FLUSH PRIVILEGES;
替换${DB_USER}和${DB_PASS}为实际的环境变量值,或直接写死(如果不需要动态替换)。
- 调整PhpMyAdmin的环境变量
确保PMA_HOST值为db(服务名),若仍有问题,添加PMA_ARBITRARY=1允许连接任意数据库主机:
phpmyadmin: # ...其他配置 environment: PMA_HOST: db PMA_USER: $(DB_USER) PMA_PASSWORD: $(DB_PASS) PMA_ARBITRARY: 1
- 验证端口与网络
- 确认本地8081端口未被其他程序占用
- 检查PhpMyAdmin容器是否正常启动:执行
docker logs phpmyadmin查看日志,排查连接错误。
内容的提问来源于stack exchange,提问作者Flavio
相关产品推荐
相关产品推荐

