Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker服务在一段时间后停止通信_Docker_Netty_Docker Swarm - Fatal编程技术网

Docker服务在一段时间后停止通信

Docker服务在一段时间后停止通信,docker,netty,docker-swarm,Docker,Netty,Docker Swarm,我有6个集装箱在docker swarm中运行。卡夫卡+动物园管理员、MongoDB、A、B、C和界面。接口是来自public的主访问点-只有此容器发布端口-5683。接口容器在启动期间连接到A、B和C。我使用docker compose file+docker stack deploy,每个服务都有一个名称,用作接口的主机。一切顺利开始,工作正常。一段时间后(20分钟,1小时,…),我无法向接口发出请求。接口接收我的请求,但应用程序与服务A、B、C或所有服务失去连接。若我重新启动接口,它就能够

我有6个集装箱在docker swarm中运行。卡夫卡+动物园管理员、MongoDB、A、B、C和界面。接口是来自public的主访问点-只有此容器发布端口-5683。接口容器在启动期间连接到A、B和C。我使用docker compose file+docker stack deploy,每个服务都有一个名称,用作接口的主机。一切顺利开始,工作正常。一段时间后(20分钟,1小时,…),我无法向接口发出请求。接口接收我的请求,但应用程序与服务A、B、C或所有服务失去连接。若我重新启动接口,它就能够重新连接到服务A、B、C

我首先认为这是应用程序的问题,所以我在每个服务(接口A、B、C)上公开了2个新端口,并与探查器和调试器连接。应用程序运行正常,没有泄漏,没有阻塞的线程,正常工作并等待连接。调试器向我显示,当我向接口发出请求,并且接口尝试请求服务时,会引发由对等异常重置的连接

在调试过程中,我发现了一些有趣的东西。当服务启动时,我将调试器连接到接口,并且调试器在一段时间后被断开连接我无法重新连接它,直到我向容器->应用程序发出请求。问题-握手失败

我发现的另一件有趣的事情是,我无法请求这两个接口。所以我用wireshark来看看发生了什么:SYN-ACK很好。然后应用程序发布一些数据,接口用FIN、ACK响应。我假设,当接口尝试请求服务A并为连接提供FIN时,也会发生这种情况。对于netty服务器,接口A、B和C的代码库是相同的

最后,我不认为这是一个应用程序问题。为什么?我尝试将容器部署为非服务。我分别运行每个容器,发布每个容器的端口,并将服务的端点设置为localhost。(不是覆盖网络)。它正在发挥作用。集装箱运行没有问题一开始我并没有说java应用程序(interface,A,B,C)作为独立应用程序运行时不会出现问题,而不是在docker中

你能帮我解决一下问题吗?为什么重叠网络中的docker正在关闭套接字


我用的是最新的docker。我也用了旧的。

最后,我解决了这个问题

发生了什么,又一次。接口打开到A、B、C的永久TCP连接。当您尝试将这些服务A、B、C作为独立java应用程序运行时,一切都正常。当我们将它们对接并在swarm中运行时,它只工作了几分钟。奇怪的是,当您从客户端向接口发出请求时,接口和另一个服务之间的连接被中断

在多次失败的测试和调试每个容器之后,我尝试使用映射端口和指定的localhost作为端点分别运行每个docker容器。(每个容器暴露的端口和接口都连接到本地主机)有趣的事情发生了,它正在工作。当您运行这样的容器时,将使用不同的容器网络驱动程序。一号桥。若您在swarm中运行它,将使用覆盖网络驱动程序

因此,它必须与docker网络有关,而不是应用程序本身。下一步是在几分钟后从每个容器中进行tcpdump,此时它应该停止工作。非常有趣

  • 客户端->接口(确定,接受请求)
  • 接口->(转发请求,因为它属于A)A
    • 界面->A[帖子]
    • A->接口[重置]
在几分钟没有通信的情况下,A正在重置打开的TCP通信。为什么?

Docker使用IP虚拟服务器,IPV维护自己的连接表。IPVS表中CLOSE_WAIT连接的默认超时为60秒。因此,当服务器在60秒后发送内容时,IPVS连接不再可用,数据包对于新的TCP会话看起来无效,并获得RST。在客户端,连接永远保持在FIN_WAIT2状态,因为应用程序仍然打开套接字;内核的fin_wait计时器只对孤立的TCP套接字起作用


这就是我读到的关于它的内容以及如何理解它。我不确定我对问题的解释是否正确,但基于这些假设,我在接口和A、B、C服务之间实现了乒乓,以防“接口”、“A”、“B”和“C”都是您自己的Java应用程序而没有通信?我不知道什么是“接口”。另外,你有没有在没有Docker Swarm的Docker Compose(只有一台主机)中尝试过这种方法?我的猜测是,应用程序与Docker Swarm路由器的工作方式很奇怪,因此尝试不使用Docker Swarm可能是个好主意。是的,a、B、C和interface是我的java应用程序,具有相同的基本代码。共享的基本代码包含netty等内容。接口是服务的唯一名称,可以方便地解释问题-只有此接口是公共接口,并充当其他服务的网关,这些服务不发布端口它负责身份验证和授权,但这是业务逻辑。正如我所写的,我尝试分别运行每个容器,每个容器都发布了它公开的端口,并且我使用localhost作为ip,所以接口连接的不是dns主机名,而是localhost。这没有任何问题。我在调试模式下运行docker守护程序,当我请求接口时,它不工作,我在日志中发现“未命中通知,l2 mac 02:42:0a:ff:00:02 DEBU[1479]未命中通知,l2 mac 02:42:0a:ff:00:08 DEBU[1479]未命中通知,l2 mac 02:42:0a:ff:00:08 DEBU[1479]未命中通知,l2 mac 02:42:0a:00:00:07 DEBU[1479]目标IP的未命中通知,10.0.0.2。有什么建议吗?另一个有趣的评论是接口是connect