使用Docker-Compose部署时出现WordPress数据库连接/认证错误
排查Docker Compose下WordPress与MySQL的连接/认证错误
看起来你遇到了Docker环境下WordPress连不上MySQL的典型问题,我帮你一步步拆解排查方向,先从最容易忽略的配置细节开始:
1. 先补全WordPress的服务配置(你贴的片段里没包含这部分)
你的docker-compose.yml只定义了MySQL服务,但WordPress服务的配置才是连接的核心。如果没正确配置WordPress的环境变量,肯定会报连接错误。这里给你一个标准的配套配置模板,重点看WordPress的环境变量:
version: '2' services: mysql: image: mysql:latest container_name: mysql restart: always environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_USER=user - MYSQL_PASSWORD=password - MYSQL_DATABASE=wordpress # 新增:初始化时自动创建WordPress需要的数据库 ports: - '3306:3306' volumes: - mysql_data:/var/lib/mysql # 持久化MySQL数据,避免容器重启丢失 wordpress: image: wordpress:latest container_name: wordpress restart: always environment: - WORDPRESS_DB_HOST=mysql:3306 # 重点!用MySQL的服务名(不是localhost),Docker内部网络通过服务名互通 - WORDPRESS_DB_USER=user - WORDPRESS_DB_PASSWORD=password - WORDPRESS_DB_NAME=wordpress ports: - '80:80' volumes: - wordpress_data:/var/www/html depends_on: - mysql # 确保MySQL先启动(但不保证完全初始化,WordPress会自动重试) volumes: mysql_data: wordpress_data:
2. 验证MySQL的用户权限与数据库状态
即使配置了用户,MySQL默认的用户权限可能限制了远程(容器内)连接:
- 先查看MySQL容器的启动日志,确认初始化无错误:
日志里如果出现docker-compose logs mysqlready for connections说明MySQL正常启动。 - 进入MySQL容器,检查用户的访问权限:
进入MySQL命令行后执行:docker exec -it mysql mysql -uroot -proot
你需要确保SELECT user, host FROM mysql.user;user(或root用户)的host是%,而不是localhost——因为WordPress容器是通过Docker内部网络连接,不是MySQL容器的本地localhost,%表示允许任意主机访问。 - 如果host不对,执行以下命令修改权限:
(如果用root用户连接,就把ALTER USER 'user'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;user换成root)
3. 测试容器间的网络连通性
有时候问题出在Docker网络不通,你可以直接在WordPress容器里测试MySQL连接:
- 先找到WordPress容器的名称(如果用上面的配置就是
wordpress),进入容器:docker exec -it wordpress bash - 在容器内ping MySQL服务名,看能不能连通:
如果能ping通,说明网络没问题;如果不行,检查两个服务是否在同一个docker-compose网络里(默认同一个compose文件的服务会在同一网络)。ping mysql - 再用MySQL客户端直接连接测试:
如果能成功进入MySQL命令行,说明MySQL的用户和权限没问题,问题大概率在WordPress的配置上;如果连不上,回到第二步检查MySQL的用户权限。mysql -h mysql -uuser -ppassword
4. 关于root用户连接的注意事项
你提到已经试过root用户,但默认mysql:latest镜像的root用户host是localhost,只能在MySQL容器内部访问,所以需要先修改root用户的host为%,再用root用户配置WordPress的环境变量:
ALTER USER 'root'@'%' IDENTIFIED BY 'root'; FLUSH PRIVILEGES;
然后把WordPress的WORDPRESS_DB_USER设为root,WORDPRESS_DB_PASSWORD设为root即可。
按上面的步骤一步步排查,应该能定位到问题所在。
内容的提问来源于stack exchange,提问作者larsrbak
相关产品推荐
相关产品推荐

