我在一起在Docker群中运行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时,抛出了由同级异常重置的连接。
在调试过程中,我发现有趣的东西。当服务启动并且调试器在一段时间后断开连接时,我将调试器连接到接口。 +我无法重新连接,直到向容器 - >应用程序发出请求。问题 - 握手失败。
,我发现了另一个有趣的事情是,我无法要求既不接口。所以我用wireshark来看看发生了什么,并且:SYN - ACK很好。然后应用程序发布一些数据和接口以FIN,ACK进行响应。我认为这也发生在接口试图请求服务A并且它终止连接时。接口的代码库,A,B和C对于netty服务器是一样的。
最后,我不认为这是一个应用程序问题。为什么?我试图将容器部署为不作为服务。我分别运行每个容器,发布每个端口的服务端点和设置为localhost。 (不覆盖网络)。它正在工作。容器运行没有问题。 +在开始时我并没有说过,当java应用程序(接口,A,B,C)作为独立应用程序运行时没有问题,而不是在docker中运行。
你能帮我解决这个问题吗?为什么码头在覆盖网络的情况下关闭套接字?
我正在使用最新的码头。我也用得比较老。
“接口”,“A”,“B”和“C”是你自己的Java应用程序吗?我很困惑什么是“接口”。另外,你是否在没有Docker Swarm的Docker Compose中尝试过这种方法?我的猜测是,该应用程序与Docker Swarm路由器奇怪地工作,所以也许尝试没有Docker Swarm可能是一个好主意。 –
是的,A,B,C和接口是我的Java应用程序,具有相同的基本代码。共享的基本代码除其他外包含netty。接口只是服务的名称,可以很容易地解释这个问题 - 只有这个接口是公共接口,并且作为其他服务的网关,不会发布端口。 +它负责认证和授权,但这是业务逻辑。 –
正如我写的,我试图分别运行每个容器,每个容器都公布了它公开的端口,并且我使用localhost作为ip,因此interface不是连接到dns主机名,而是连接到localhost。这工作没有任何问题。 –