要让宿主机外网访问 Docker 中的 Hyperf 服务,必须同时满足:Hyperf 监听 0.0.0.0:9501(非 127.0.0.1)、Docker 正确映射 -p 9501:9501(绑定到 0.0.0.0)、宿主机防火墙及云安全组放行 9501 端口。

要让宿主机外网能访问 Docker 中运行的 Hyperf 服务,核心是端口映射 + 网络可达性配置,不是单纯改 docker run -p 就完事。关键在三处:容器端口正确暴露、宿主机防火墙/安全组放行、服务监听地址绑定对了。
确认 Hyperf 监听的是 0.0.0.0 而非 127.0.0.1
Hyperf 默认启动时监听 127.0.0.1:9501,这会导致容器内可通,但外部无法连接。必须显式改成监听所有接口:
- 修改
config/autoload/server.php中的server配置项:'host' => '0.0.0.0', - 确保
'port' => 9501与后续映射端口一致 - 重启服务后,可用
netstat -tuln | grep 9501在容器内验证是否监听在*:9501
Docker 运行时正确做端口映射
使用 -p 参数将容器端口映射到宿主机网络接口,注意格式和权限:
- 基础命令示例:
docker run -d --name hyperf-app -p 9501:9501 -v $(pwd):/app hyperf/hyperf:8.1-alpine-v3.16-cli php bin/hyperf.php start - 若需外网访问,不能用
127.0.0.1:9501:9501(即加127.0.0.1:前缀),否则只绑定本地回环 - 推荐写法是直接
-p 9501:9501,Docker 默认绑定到0.0.0.0 - 验证映射是否生效:
docker port hyperf-app应输出9501/tcp -> 0.0.0.0:9501
宿主机网络层放行:防火墙与云平台安全组
即使 Docker 映射成功,宿主机系统防火墙或云服务商安全组仍会拦截请求:
- Linux(如 Ubuntu/CentOS)检查并开放端口:
sudo ufw allow 9501或sudo firewall-cmd --add-port=9501/tcp --permanent && sudo firewall-cmd --reload - 阿里云/腾讯云等控制台中,找到对应 ECS 实例的「安全组」,添加入方向规则:
协议类型 TCP,端口范围9501/9501,授权对象填0.0.0.0/0(或限定 IP 段更安全) - Windows WSL 用户注意:WSL2 的端口默认不自动转发到 Windows 主机,需额外执行:
echo "netsh interface portproxy add v4tov4 listenport=9501 listenaddress=0.0.0.0 connectport=9501 connectaddress=127.0.0.1" | powershell
验证外网访问是否真正通了
别只在宿主机 curl,要从另一台机器(比如手机连同一 WiFi)测试:
- 查宿主机公网 IP:
curl ifconfig.me(注意:家用宽带通常无固定公网 IP,需走内网穿透或云服务器) - 从外部设备访问:
http://[宿主机公网IP]:9501或http://[域名]:9501 - 若超时,优先检查安全组;若返回连接被拒绝,重点查 Hyperf 是否监听
0.0.0.0和 Docker 映射是否漏写 - 日志排查:
docker logs hyperf-app看启动日志是否有Server started及监听地址提示


















