项目场景:
通过云服务器和本地使用frp实现内网穿透时,出现connect to local service [127.0.0.1:8080] error: dial tcp 127.0.0.1:8080: connect: connection refused这种问题。内网穿透教程详见小傅哥教程:内网穿透教程
问题描述
在本机和云服务器都通过docker布置好frp服务后,本地启动项目于8080端口,但是通过服务器内网穿透失败,查看本机docker中的frp的运行日志,发现我每请求一次,就输出一次错误:2025-07-06 12:08:09.503 [E] [proxy/proxy.go:206] [a96fa10c615bf04a] [xfg-dev-tech-01] connect to local service [127.0.0.1:8080] error: dial tcp 127.0.0.1:8080: connect: connection refused。
原因分析:
原因是因为docker默认的和本机网络有网络隔离,所以docker找不到127.0.0.1:8080端口,
解决方案:
查询网上各种资料和咨询gpt
默认的方案:在frpc的docker-compose.yml文件夹下添加
network_mode: "host"
完整代码如下
version: '3.9'
services:
frpc:
image: fatedier/frpc:v0.60.0
hostname: frpc
container_name: frpc
volumes:
- "./config/frpc.toml:/frpc.toml"
command:
- "-c"
- "/frpc.toml"
network_mode: "host"
这行代码表示这表示 frpc 容器使用宿主机网络,frpc 内访问 127.0.0.1:8080 就等价于访问你本地宿主机的 127.0.0.1:8080,理论上应该可以直接连接本地运行的服务,但是我重新部署后还是报一样的错。
接下来的方案,修改frpc.toml文件中的localIP字段为
localIP = "host.docker.internal"
原先代码
serverAddr = "你服务器的公网ip"
# 服务端配置的bindPort
serverPort = 7000
# token =
[[proxies]]
# 代理应用名称,根据自己需要进行配置
name = "xfg-dev-tech-01"
# 代理类型 有tcp\udp\stcp\p2p
type = "tcp"
# 客户端代理应用IP
localIP = "127.0.0.1"
# 客户端代理应用端口
localPort = 8080
# 服务端反向代理端口;提供给外部访问
remotePort = 8080
修改为
serverAddr = "你服务器的公网ip"
# 服务端配置的bindPort
serverPort = 7000
# token =
[[proxies]]
# 代理应用名称,根据自己需要进行配置
name = "xfg-dev-tech-01"
# 代理类型 有tcp\udp\stcp\p2p
type = "tcp"
# 客户端代理应用IP
localIP = "host.docker.internal"
# 客户端代理应用端口
localPort = 8080
# 服务端反向代理端口;提供给外部访问
remotePort = 8080
然后就可以正常内网穿透了
查阅资料
host.docker.internal 是 Docker Desktop 提供的专用桥梁
它是 Docker Desktop 为了解决容器访问宿主机服务的问题,专门提供的一个虚拟主机名,它指向你的宿主机 IP。
举例说明
- 你在 Windows 上本地跑了一个 Spring Boot 项目监听
8080 - frpc 容器运行在 Docker 内部,它默认无法访问宿主机的 127.0.0.1:8080
- 但你写上
localIP = "host.docker.internal"后,Docker 内部的 frpc 容器就能通过这个地址访问到你宿主机的 8080 端口服务了
1433

被折叠的 条评论
为什么被折叠?



