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

MySQL 8.4.3搭配WordPress Docker无法连接数据库的解决咨询

WordPress + MySQL 8.4.3 Docker Compose 连接问题修复

问题描述

部署WordPress与MySQL 8.4.3容器后,WordPress无法连接数据库,本地IntelliJ IDEA也无法直接连接MySQL,需调整配置适配MySQL 8.x版本特性。

官方参考配置(2024年底WordPress Docker官方示例)

services:
  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wordpress:/var/www/html
  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql
volumes:
  wordpress:
  db:

当前用户配置

services:
  WordPress:
    container_name: Example-WordPressHomePage-WordPress
    image: wordpress:6.7.1-php8.1-apache
    ports:
      - 80:80
    volumes:
      - ./wordpress:/var/www/html
    restart: always
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
      - WORDPRESS_DB_NAME=wordpress
  Database:
    container_name: Example-WordPressHomePage-Database
    image: mysql:8.4.3
    volumes:
      - ./database:/var/lib/mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=somewordpress
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress
    expose:
      - 3306
      - 33060

修复步骤

1. 统一容器间DNS服务名

Docker Compose中,容器通过服务名进行DNS解析。当前WordPress配置的WORDPRESS_DB_HOST=db,但数据库服务名为Database,导致无法解析。二选一修改:

  • 把数据库服务名改为db(和官方示例一致)
  • 把WordPress的WORDPRESS_DB_HOST改为Database

2. 添加MySQL 8.x 认证插件兼容配置

MySQL 8.0+默认使用caching_sha2_password认证插件,部分旧版PHP MySQL驱动(如php8.1的mysqlnd)可能不兼容。需为数据库用户指定兼容的认证插件:
在Database服务的environment中添加:

- MYSQL_DEFAULT_AUTH=mysql_native_password

该配置会让MySQL默认使用mysql_native_password创建新用户,确保WordPress能正常连接。

3. 添加本地端口映射(解决IntelliJ连接问题)

当前仅expose端口(仅容器间可见),本地工具无法访问。需在Database服务中添加端口映射:

ports:
  - "3306:3306"

这样本地可以通过localhost:3306连接MySQL。

4. 处理目录权限与启动顺序(可选但重要)

  • 目录权限:Linux/macOS下,本地挂载的./database目录权限需匹配MySQL容器内用户ID(通常为999),执行:
    sudo chown -R 999:999 ./database
    
  • 启动顺序:WordPress可能在MySQL初始化完成前启动,导致连接失败。可添加依赖与健康检查,确保MySQL就绪后再启动WordPress:
    在WordPress服务中添加:
    depends_on:
      db:
        condition: service_healthy
    
    在Database服务中添加健康检查:
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"]
      interval: 10s
      timeout: 5s
      retries: 5
    

修改后的完整配置示例

services:
  WordPress:
    container_name: Example-WordPressHomePage-WordPress
    image: wordpress:6.7.1-php8.1-apache
    ports:
      - 80:80
    volumes:
      - ./wordpress:/var/www/html
    restart: always
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
      - WORDPRESS_DB_NAME=wordpress
    depends_on:
      db:
        condition: service_healthy
  db:
    container_name: Example-WordPressHomePage-Database
    image: mysql:8.4.3
    volumes:
      - ./database:/var/lib/mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=somewordpress
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress
      - MYSQL_DEFAULT_AUTH=mysql_native_password
    ports:
      - "3306:3306"
    expose:
      - 3306
      - 33060
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"]
      interval: 10s
      timeout: 5s
      retries: 5

内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 09:47:21