宿主机访问不到FrankenPHP容器,根本原因是其默认监听127.0.0.1:8080(仅限容器内),必须显式指定--address=0.0.0.0:8080或在frankenphp.toml中配置server.address="0.0.0.0:8080",并确保docker run使用完整端口映射-p 8080:8080。

宿主机访问不到 FrankenPHP 容器,问题几乎肯定出在监听地址或端口映射链路上——容器内 curl http://127.0.0.1:8080 成功,只说明服务起来了;但宿主机连不上,说明流量没真正穿过容器网络边界。
确认 FrankenPHP 是否监听 0.0.0.0 而非 127.0.0.1
FrankenPHP 默认启动命令是 frankenphp serve,它会监听 127.0.0.1:8080(仅限容器内部)。这正是“容器内能通、宿主机不通”的最常见原因。
- 进容器检查真实监听地址:
netstat -tuln | grep :8080,输出必须含0.0.0.0:8080,不能是127.0.0.1:8080 - 临时修复:加
--address=0.0.0.0:8080启动,例如:docker run -p 8080:8080 dunglas/frankenphp --address=0.0.0.0:8080 - 长期方案:在挂载的
frankenphp.toml中显式设[server] address = "0.0.0.0:8080" - 注意:镜像
dunglas/frankenphp的默认行为就是监听127.0.0.1,不改就永远对外不可达
验证 -p 端口映射是否真正生效
docker ps 显示 “Up” 不代表端口绑定了。很多用户误以为加了 -p 就万事大吉,其实参数写错、顺序错、甚至被后续参数覆盖都会导致映射失效。
- 运行
docker port <容器ID或name>,应输出类似8080->8080;若无输出,说明-p没生效 - 检查是否用了
-p 8080(只写了宿主机端口)——必须写全-p 8080:8080或-p 8080:80这种 host:container 格式 - 避免与已有进程冲突:宿主机执行
sudo lsof -i :8080,确认端口未被 Skype、IIS、或其他 Docker 容器占用
排查宿主机系统级拦截
尤其在 Windows 或企业 Linux 环境下,即使容器和映射都对,流量也可能卡在宿主机内核或防火墙层。
立即学习“PHP免费学习笔记(深入)”;
- Linux:检查
sysctl net.ipv4.ip_forward是否为1;若为0,Docker NAT 规则根本不会转发 - Linux:运行
sudo firewall-cmd --list-ports(firewalld)或sudo iptables -L -n(iptables),确认目标端口已放行 - Windows:
netsh interface ipv4 show excludedportrange protocol=tcp查看动态端口范围是否挤占了你用的端口(如 8080) - Windows:禁用「World Wide Web Publishing Service」(W3SVC),它会静默抢占 80/443,有时连带影响其他端口
最容易被忽略的是:FrankenPHP 镜像默认监听 127.0.0.1,而绝大多数教程只教你怎么跑起来,却没强调必须显式覆盖监听地址——这个点不处理,其他所有排查都是徒劳。



















