问题描述
在使用Docker安装WordPress时,许多用户会遇到一个常见问题:WordPress容器无法连接到MySQL/MariaDB数据库。当访问WordPress站点时,通常会看到”建立数据库连接时出错”的错误提示。
可能原因分析
- 数据库容器未正确启动:MySQL/MariaDB容器可能没有正常运行
- 网络配置问题:WordPress和数据库容器不在同一Docker网络中
- 连接参数错误:wp-config.php中的数据库配置不正确
- 权限问题:数据库用户没有足够的权限
- 端口冲突:3306端口可能被其他服务占用
详细解决方案
1. 检查容器状态
首先确认所有容器都已启动并运行正常:
docker ps -a
确保MySQL和WordPress容器的STATUS列都显示为”Up”。
2. 创建自定义Docker网络
推荐为WordPress和数据库创建一个专用网络:
docker network create wordpress_network
然后运行MySQL容器时加入该网络:
docker run --name mysql_db --network wordpress_network -e MYSQL_ROOT_PASSWORD=yourpassword -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpress -d mysql:5.7
运行WordPress容器时也加入同一网络:
docker run --name wordpress --network wordpress_network -e WORDPRESS_DB_HOST=mysql_db -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=wordpress -e WORDPRESS_DB_NAME=wordpress -p 8080:80 -d wordpress
3. 验证数据库连接
进入WordPress容器测试数据库连接:
docker exec -it wordpress bash
apt-get update && apt-get install -y mysql-client
mysql -h mysql_db -u wordpress -p
输入密码后应能成功连接数据库。
4. 检查wp-config.php配置
如果使用已有WordPress安装,确保wp-config.php中包含正确的数据库信息:
define('DB_NAME', 'wordpress');
define('DB_USER', 'wordpress');
define('DB_PASSWORD', 'wordpress');
define('DB_HOST', 'mysql_db');
5. 防火墙和端口检查
确保没有防火墙阻止容器间的通信:
sudo ufw status
如果启用,添加规则允许Docker通信:
sudo ufw allow from 172.16.0.0/12
常见错误排查
- Error establishing a database connection
- 检查数据库容器是否运行
- 验证数据库用户名和密码
- Unknown MySQL server host ‘mysql’
- 确认使用了正确的容器名称作为主机名
- 确认两个容器在同一网络
- Access denied for user
- 重新创建数据库用户并授予权限
- 检查密码是否匹配
最佳实践建议
- 使用Docker Compose简化管理
- 为生产环境设置数据库持久化存储
- 定期备份数据库
- 使用最新稳定版的镜像
- 为不同项目创建独立的Docker网络
通过以上步骤,应该能够解决Docker中WordPress连接数据库的问题。如果问题仍然存在,可以查看容器日志获取更多信息:
docker logs mysql_db
docker logs wordpress