最近项目环境的SpringCloud网关在转发某服务请求时,发现总是没有响应。
排查了很久才发现,在SpringCloud网关所在docker容器内执行 curl -v 'http://目标服务地址'时,显示无法建立tcp连接(卡着没响应)
root@26825633119e:/# curl -v 'http://10.1.39.119:38080'
* Trying 10.1.39.119:38080...
* TCP_NODELAY set
* connect to 10.1.39.119 port 38080 failed: Connection timed out
* Failed to connect to 10.1.39.119 port 38080: Connection timed out
* Closing connection 0
curl: (28) Failed to connect to 10.1.39.119 port 38080: Connection timed out
具体就是:
10.1.39.119:38080 端口通过docker容器开了一个服务;
在10.1.39.119 这台主机上面,可以访问
在其他主机 上面, 也可以访问
在其他主机的 docker容器内,也可以访问
但是奇怪就奇怪在,
在 10.1.39.119 上的所有docker容器里,都访问不到 38080 这个端口。
但是 还是10.1.39.119这台机器的docker容器里, 却能访问 这台机器上的 其他服务端口, 比如7100 等等
这会是什么原因呢?防火墙吗?要怎样排查呢?感谢!
补充,10.1.39.119:38080 这个服务的docker-compose文件,如果把 38080端口改成其他小一点的端口号,比如9750, 其他环境的访问就完全正常了。会是什么原因呢?见鬼了
以下内容来自于百度:或许可以帮到您。(本人未亲自确认是否是此原因造成的)
Docker 默认允许映射 49152 到 65535 之间的端口,也就是称为“高端本地端口范围”。如果你需要使用大于 32768 的端口,你需要修改 Docker 的配置来允许这样的映射。
修改 Docker 配置允许高端端口映射:
编辑 Docker 的服务文件。
在 Ubuntu 或 Debian 系统上,你可以使用 systemctl 编辑 Docker 服务文件:
bash
sudo systemctl edit docker.service
在打开的编辑器中,添加或修改 ExecStart 行,添加 -H tcp://0.0.0.0:<PORT>,其中 <PORT> 是你想要 Docker 监听的端口。
例如,要允许 Docker 监听端口 32770,你会添加:
ini
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:32770 -H unix:///var/run/docker.sock
保存并退出编辑器。
重新加载 systemd 配置,以确保新的服务文件设置生效:
bash
sudo systemctl daemon-reload
重启 Docker 服务:
bash
sudo systemctl restart docker.service
请注意,允许 Docker 监听任意端口可能会带来安全风险,因为它将暴露 Docker 守护进程接口给所有网络上的主机。始终确保你的端口访问是通过适当的防火墙规则来限制的。