Docker WordPress容器无法连接Docker MySQL容器问题求助
问题根源:Docker容器的网络隔离
这个问题其实是Docker网络隔离的典型坑——容器里的127.0.0.1和你宿主机的127.0.0.1根本不是一回事!你在宿主机上用Tinker、PHP脚本或Sequel Pro能连MySQL,是因为你访问的是宿主机本地的回环地址;但WordPress运行在Docker容器里,容器内部的127.0.0.1指向的是容器自己的网络栈,不是宿主机,所以自然连不上目标MySQL服务。
分场景解决方案
场景1:MySQL运行在另一个Docker容器中
这是Docker多容器部署的常规场景,正确做法是利用Docker自定义网络让两个容器互通:
- 创建自定义Docker网络(比默认bridge网络更稳定,支持容器名解析):
docker network create wp-mysql-network - 启动MySQL容器并加入该网络:
docker run -d \ --name mysql-container \ --network wp-mysql-network \ -e MYSQL_ROOT_PASSWORD=root \ -e MYSQL_DATABASE=wp_db \ mysql:latest - 启动WordPress容器并加入同一网络,同时把
DB_HOST设为MySQL容器的名称(mysql-container):
用Docker Compose的话配置更简洁:docker run -d \ --name wp-container \ --network wp-mysql-network \ -p 10000:80 \ -e WORDPRESS_DB_HOST=mysql-container:3306 \ -e WORDPRESS_DB_USER=root \ -e WORDPRESS_DB_PASSWORD=root \ -e WORDPRESS_DB_NAME=wp_db \ wordpress:latestversion: '3.8' services: mysql: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: wp_db networks: - wp-net wordpress: image: wordpress:latest ports: - "10000:80" environment: WORDPRESS_DB_HOST: mysql:3306 WORDPRESS_DB_USER: root WORDPRESS_DB_PASSWORD: root WORDPRESS_DB_NAME: wp_db networks: - wp-net networks: wp-net: driver: bridge
场景2:MySQL运行在宿主机(非Docker容器)
这种情况需要让WordPress容器访问宿主机的MySQL服务:
- Linux系统:可以用宿主机的内网IP(比如
192.168.1.100),或者Docker 20.10+版本支持的host.docker.internal(启动容器时需加--add-host=host.docker.internal:host-gateway参数)。 - macOS/Windows系统:Docker Desktop默认支持
host.docker.internal作为宿主机别名,直接用这个地址即可。
之后把WordPress配置里的DB_HOST改成host.docker.internal:3306(或你的宿主机内网IP)。
额外检查项
- MySQL权限设置:确保你的MySQL用户(比如root)允许从WordPress容器的IP或任意地址连接,执行以下SQL修改权限:
注:GRANT ALL PRIVILEGES ON wp_db.* TO 'root'@'%' IDENTIFIED BY 'root'; FLUSH PRIVILEGES;%表示允许任意地址连接,生产环境建议限制为特定IP,此处仅作测试用。 - 防火墙/安全组:确认宿主机或容器的防火墙没有阻止3306端口的通信。
- WordPress配置文件:如果手动修改
wp-config.php,检查DB_HOST、DB_USER、DB_PASSWORD、DB_NAME参数是否完全正确,无拼写错误。
内容的提问来源于stack exchange,提问作者Mubin
相关产品推荐
相关产品推荐

