Docker部署WordPress无法连接MySQL,应使用何种数据库主机名?
Docker搭建WordPress数据库连接问题解决
问题背景
在Mac上使用Docker Compose搭建本地WordPress网站,使用的docker-compose.yml配置如下:
version: '3' services: db: platform: linux/x86_64 image: mysql:5.7 ports: - "3306:3306" volumes: - wordpress_db:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} wordpress: image: wordpress:php7.4-apache depends_on: - db ports: - "8000:80" volumes: - ./:/var/www/html environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: ${MYSQL_USER} WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD} WORDPRESS_DB_NAME: ${MYSQL_DATABASE} volumes: wordpress_db:
数据库常量定义在.env文件中,执行docker-compose up -d无异常,且能通过Sequel Ace等GUI工具访问数据库,但访问http://localhost:8000时出现错误:
Warning: mysqli_real_connect(): (HY000/2002): No such file or directory in /var/www/html/wp-includes/class-wpdb.php on line 1987
No such file or directory
尝试修改wp-config.php中的DB_HOST为localhost或127.0.0.1后,出现新错误:
Warning: mysqli_real_connect(): (HY000/2002): Connection refused in /var/www/html/wp-includes/class-wpdb.php on line 1987
Connection refused
解决方案
正确的数据库主机名应为db,也就是docker-compose.yml中定义的数据库服务名称。
原因说明
- Docker Compose会自动为同一项目下的所有容器创建专属网络,容器之间可以通过服务名称直接通信,服务名会被Docker DNS解析为对应容器的IP地址。
- 若设置
localhost或127.0.0.1,WordPress容器会尝试连接自身内部的数据库服务(但容器内并未安装MySQL),因此会出现连接拒绝或找不到文件的错误。宿主机的端口映射(3306:3306)仅用于外部客户端(比如你的Mac)访问数据库,容器间通信无需依赖端口映射。
额外检查点
- 若之前手动修改过
wp-config.php,需确认DB_HOST是否被设置为db。如果被覆盖,可直接修改DB_HOST为db,或者删除wp-config.php后重启容器(WordPress镜像会自动读取环境变量重新生成配置文件,注意备份自定义配置)。
内容的提问来源于stack exchange,提问作者superfive33
相关产品推荐
相关产品推荐

