端口号在个别环境无法访问,会是什么原因呢?

最近项目环境的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, 其他环境的访问就完全正常了。会是什么原因呢?见鬼了

阅读 2.4k
2 个回答

以下内容来自于百度:或许可以帮到您。(本人未亲自确认是否是此原因造成的)
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 守护进程接口给所有网络上的主机。始终确保你的端口访问是通过适当的防火墙规则来限制的。

那你在容器里面看看是不是有针对该容器所在网段的某些端口的防火墙

推荐问题
宣传栏