Docker端口映射后Host端curl报(56) Recv failure问题求助
问题原因分析及验证方案
最可能的原因:Dream服务仅绑定容器本地回环地址(127.0.0.1)
Ocaml/Dream框架默认启动时,服务会绑定到127.0.0.1(容器内部的localhost),而非容器的对外网络接口地址(0.0.0.0)。这种情况下:
- 容器内部通过
localhost:8080访问时,请求直接命中回环地址,所以正常; - 主机通过端口映射
8084:8080访问时,Docker会把主机的请求转发到容器的0.0.0.0:8080,但服务根本没监听这个地址,导致连接被重置。
验证方法
在容器内执行以下命令,查看服务监听的地址:
ss -tulpn | grep 8080
如果输出显示监听地址是127.0.0.1:8080,而非0.0.0.0:8080,则确认是这个问题。
解决方式
修改你的Dream服务代码,启动时指定监听所有接口:
(* 根据实际启动逻辑调整示例代码 *) Dream.run ~interface:"0.0.0.0" ~port:8080 my_handler
或者使用Dream.serve时指定接口:
Dream.serve ~interface:"0.0.0.0" ~port:8080 my_handler
其他可能性较低的原因
- 主机防火墙/iptables规则异常:虽然Nginx容器正常,但极少数情况下,Dream服务的网络包特征可能被主机防火墙拦截。可临时关闭主机防火墙测试(如
systemctl stop firewalld),若问题解决,需调整防火墙规则允许Docker端口转发的流量。 - Docker网络命名空间配置问题:个别情况下容器的网络命名空间存在异常,可尝试重新构建镜像或删除现有容器后重新创建,排除临时配置问题。
内容的提问来源于stack exchange,提问作者Abdelghani
相关产品推荐
相关产品推荐

