我有一个Azure容器应用程序正在运行,并侦听公共TCP端口8000(通过负载平衡器)上的传入连接。当传入连接到达时,我为它们提供数据,一切都按预期进行。
我的问题是当我停止服务器监听该端口时,尝试连接到端口8000上的公共IP地址的客户端应用程序将收到类似于 “无法连接” 的错误,但实际上并没有发生这种情况。实际上发生的情况是,无论如何,容器应用程序环境似乎都在将数据转发到该端口(即使没有服务器监听)。因此,连接到该端口的客户端无法理解应该监听该端口的服务器实际上已经停止(以便稍后重新发送数据)。
示例:打开TCP客户端(例如PacketSender)并尝试将一些数据发送到 localhost 上的端口6000。您应该会收到 “无法连接” 错误消息。
现在,在docker中运行以下代码:
docker run -p 6000:6000 nginxdemos/hello:plain-text
再次尝试通过TCP客户端发送一些数据到端口6000。这次即使nginxdemos容器不监听端口6000(但可能在80上),数据也会被发送。
有没有什么方法可以在服务器端解决这个问题,并确保客户端在服务器停止时无法连接?我有一些设备在容器应用程序上发送数千个数据,但因为它们不期望任何形式的ACK,它们认为数据已经传输(即使它们没有),它们不会尝试重新发送它们。
1条答案
按热度按时间9wbgstp71#
不确定Docker示例,这可能取决于该系统上的Docker如何实现端口转发。
在Azure容器应用中:不,这是不可能的。始终有一些组件在端口上侦听,即使您的应用程序没有运行或正在重新启动、配置、缩放等。连接将被缓冲,直到应用程序开始侦听端口或超时。