电话
400 9058 355
Traefik 不处理 PHP 与 MySQL 连接,仅负责 HTTP 路由;PHP 容器需通过容器网络(同 Docker 网络、用服务名 mysql 作主机)访问 MySQL 容器,并确保 MySQL 配置 bind-address=0.0.0.0 且用户授权 'user'@'%'。
很多人搜 traefik php mysql 连接不上,其实是混淆了职责边界:traefik 是反向代理/网关,只管 HTTP 流量路由,它不参与、也不配置 PHP 应用怎么连 MySQL。真正要查的是你的 PHP 容器(比如 php:8.2-apache)能否从容器网络访问 MySQL 容器(比如 mysql:8.0),而 traefik 只负责把外部请求转给 PHP 容器。
典型现象是 PHP 报错:PDOException: SQLSTATE[HY000] [2002] Connection refused 或 mysqli_connect(): (HY000/2002): Connection refused。重点看这几点:
docker ps 确认状态,不是 Exited
docker network inspect your-network-name 查看两者是否共属一个 Containers 列表mysql),而不是 localhost 或 127.0.0.1 —— 容器内 localhost 指自己,不是 MySQL 容器127.0.0.1;需在 my.cnf 中设 bind-address = 0.0.0.0,或用 Docker 启动参数 --bind-address=0.0.0.0
'user'@'localhost',但 PHP 容器 IP 不是 localhost,应改用 'user'@'%' 并执行 FLUSH PRIVILEGES;
下面是最小可行的三件套(traefik + php + mysql)网络配置要点,注意注释部分:
version: '3.8'
services:
traefik:
image: traefik:v2.10
command:
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
ports:
- "80:80"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
php:
image: php:8.2-apache
depends_on:

localhost)"
networks:mysql: image: mysql:8.0 environment:
networks: appnet: driver: bridge
别急着改代码,先进 PHP 容器手动测试连通性:
docker exec -it sh
apk add mysql-client(Alpine)或 apt-get update && apt-get install -y mysql-client(Debian)mysql -h mysql -u appuser -pappsecret appdb -e "SELECT 1" —— 这里 -h mysql 是关键,必须用服务名new PDO(...) 参数是否一致最容易被忽略的是:MySQL 容器日志里有没有报错?用 docker logs 看是否启动失败、密码错误、或权限拒绝。很多“连不上”其实 MySQL 根本没起来。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...