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服务中添加:
在Database服务中添加健康检查:depends_on: db: condition: service_healthyhealthcheck: 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
相关产品推荐
相关产品推荐

