我在Docker Swarm中运行了6个容器。其中包括Kafka+Zookeeper、MongoDB、A、B、C和接口。接口是公共访问的主要入口点 - 只有这个容器发布了端口5683。启动时,接口容器连接到A、B和C。我使用docker-compose文件和docker stack deploy,每个服务都有一个名称,用作接口的主机名。一切都成功启动并正常工作。但是在一段时间后(20分钟、1小时等),我无法向接口发送请求。接口会收到我的请求,但应用程序与服务A、B、C或全部失去连接。如果我重启接口,则可以重新连接到服务A、B、C。
我最初认为这是应用程序的问题,所以我在每个服务(接口、A、B、C)上公开了2个新端口,并连接了分析器和调试器。应用程序正常运行,没有泄漏,没有阻塞的线程,正常工作并等待连接。调试器显示当我向接口发出请求时,接口尝试请求服务A时会抛出“Connection reset by peer”的异常。
在调试期间,我发现了一些有趣的事情。当服务启动时,我将调试器附加到接口,但之后调试器会断开连接。我无法重新连接它,直到我向容器的应用程序发出请求。问题-握手失败。
我发现的另一个有趣的事情是,我也无法请求接口。因此,我使用Wireshark查看了发生了什么:SYN-ACK很好。然后应用程序发布一些数据,接口响应FIN,ACK。我认为当接口尝试请求服务A时,它也会终止连接。接口、A、B和C的代码库在Netty服务器方面是相同的。
最后,我不认为这是应用程序的问题。为什么?我尝试将容器部署为非服务。
请问您能帮我看一下问题出在哪里吗?为什么使用交叉网络时Docker会关闭套接字?
我正在使用最新版本的Docker,之前也用过较旧的版本。