Docker Compose下WordPress与MySQL连接失败问题求助
Docker Compose WordPress环境连接问题排查
环境配置文件
docker-compose.yml
version: '3.8' services: wordpress: image: wordpress:6 container_name: wp_dev environment: WORDPRESS_DB_HOST: ${MYSQL_HOST} WORDPRESS_DB_NAME: ${MYSQL_DATABASE} WORDPRESS_DB_USER: ${MYSQL_USER} WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD} ports: - "8008:80" volumes: - ./wp-data:/var/www/html db: image: mysql:5 container_name: mysql_dev environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} ports: - "3305:3306" volumes: - db_data_dev:/var/lib/mysql adminer: image: adminer:latest container_name: adminer_dev ports: - "8080:8080" volumes: db_data_dev:
初始.env文件(连接报错)
MYSQL_HOST=db:3305 MYSQL_DATABASE=wordpress MYSQL_ROOT_PASSWORD=root MYSQL_USER=user MYSQL_PASSWORD=user_pw
正常连接的.env文件
MYSQL_HOST=db MYSQL_DATABASE=wordpress MYSQL_ROOT_PASSWORD=wordpress MYSQL_USER=wordpress MYSQL_PASSWORD=wordpress
修正端口后的.env文件(仍报错)
MYSQL_HOST=db # alternativ db:3306 MYSQL_DATABASE=wordpress MYSQL_ROOT_PASSWORD=root MYSQL_USER=user MYSQL_PASSWORD=user_pw
问题现象
- 使用初始.env或修正端口后的.env时,WordPress无法连接MySQL,出现连接错误
- 使用账号密码均为
wordpress的.env配置时,连接完全正常
核心问题分析
MySQL用户权限限制
MySQL 5镜像初始化时,自定义用户(如user)默认的访问权限是user@localhost,仅允许本地连接。但WordPress容器通过Docker内部网络访问MySQL,来源是容器IP/服务名,并非localhost,因此会被拒绝。而使用wordpress作为用户名时,镜像会自动配置该用户允许从%(任意来源)访问,所以能正常连接。数据卷残留的历史配置
第一次用错误配置启动后,db_data_dev数据卷已保存了MySQL的初始化数据(包括用户权限)。后续修改.env重启容器时,MySQL不会重新初始化数据库和用户,而是直接加载已有数据卷的配置,导致自定义用户的权限问题持续存在。端口配置的误解
Docker Compose服务间通信使用容器内部端口,而非宿主机映射端口。初始配置中MYSQL_HOST=db:3305是错误的——3305是宿主机端口,MySQL容器内部实际监听3306,服务间通信应使用db(默认端口3306可省略)或db:3306,但这不是导致连接失败的核心原因。
解决方案
- 清理旧数据卷
删除已存在的MySQL数据卷,让容器重新初始化用户和权限:
docker-compose down -v
该命令会停止并删除容器,同时清除关联的命名数据卷(包括db_data_dev)。
- 修正.env配置
确保MYSQL_HOST使用正确的服务名:
MYSQL_HOST=db MYSQL_DATABASE=wordpress MYSQL_ROOT_PASSWORD=root MYSQL_USER=user MYSQL_PASSWORD=user_pw
- 重新启动容器
docker-compose up -d
此时MySQL会重新初始化,创建user用户并赋予其从任意来源访问wordpress数据库的权限,WordPress即可正常连接。
验证方式
通过Adminer确认连接:
- 访问
http://localhost:8080 - 服务器填
db,用户名填user,密码填user_pw,数据库填wordpress,点击登录验证是否能正常访问。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

