server_name=:8080是关键配置,它强制caddy在容器内监听:8080端口、禁用域名匹配与acme证书申请,实现纯http模式;必须配合docker -p 8080:8080映射且访问http://协议。

SERVER_NAME=:8080 是关键,不是随便写
FrankenPHP 容器内监听端口由 SERVER_NAME 环境变量决定,而不是靠 Docker 的 -p 映射自动推导。写成 SERVER_NAME=:8080 才会让内置 Caddy 强制监听容器内的 :8080(纯 HTTP),同时禁用域名匹配和 ACME 证书申请逻辑。
常见错误写法:SERVER_NAME=localhost:8080 或 SERVER_NAME=127.0.0.1:8080 —— Caddy 不识别带 host 的格式,会 fallback 到默认行为(监听 :8080 但可能仍尝试 HTTPS)。
-
SERVER_NAME=:8080:明确告诉 Caddy “只监听 :8080,不看域名,不发 ACME 请求” -
SERVER_NAME=example.com:即使你没配证书,Caddy 也会自动申请 HTTPS 并重定向,http://请求会被 301 跳转 - 不要混用
SERVER_NAME=:80和-p 8080:80,否则$_SERVER['HTTP_HOST']变成localhost:8080,Laravel 的APP_URL可能生成错误链接
docker run 必须同时做两件事:暴露 + 映射
光设 SERVER_NAME=:8080 不够,Docker 默认不会把容器内端口暴露给宿主机。必须显式使用 -p 将宿主机的某个端口映射到容器的 8080。
最简可用命令:
docker run -e SERVER_NAME=:8080 -p 8080:8080 dunglas/frankenphp
这条命令表示:
- 容器内 Caddy 监听
:8080(HTTP 模式) - 宿主机的
8080端口转发到容器的8080 - 访问
http://localhost:8080即可看到响应
注意:-p 8080:80 是错的——容器内根本没在 :80 监听,请求会连接被拒。
host 网络模式下不用 -p,但必须改监听地址
如果用 --network host,容器直接共享宿主机网络命名空间,-p 映射失效且被忽略。此时 FrankenPHP 默认监听 127.0.0.1:8080,外部请求进不来——因为 127.0.0.1 只响应本机 loopback 流量。
必须显式绑定到所有接口:
docker run --network host -e SERVER_NAME=:8080 dunglas/frankenphp -- -listen 0.0.0.0:8080
这里 -- 是关键分隔符,后面参数透传给 FrankenPHP 二进制;-listen 0.0.0.0:8080 强制监听全网卡。
- 不加
-listen 0.0.0.0:8080→ 外部 curl 会超时 - 加了但漏掉
--→ Docker 报错或参数被忽略 - 监听
:80需要 root 权限,非 root 容器得加--user root或换高权限端口(如:8080)
云服务器上别忘了放行 8080 端口
无论用 -p 还是 --network host,只要服务对外暴露 8080,阿里云/腾讯云的安全组就必须手动放行 8080/tcp。FrankenPHP 不绕过云厂商防火墙。
本地测试通了 ≠ 外网能访问。典型现象:
- curl
http://localhost:8080成功,但手机或另一台机器访问http://你的IP:8080超时 - 检查安全组、宿主机 firewalld/ufw 是否已开放
8080 - 运行
ss -tln | grep :8080确认进程确实在0.0.0.0:8080监听,而非127.0.0.1:8080
最容易忽略的是:用了 host 模式却没改 -listen,或者开了端口映射却忘了开云安全组——这两处一漏,服务就“消失”了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











