首页 > 解决方案 > 5 分钟后,用于托管 TCP 连接的 Docker 断开

问题描述

我有一个 CentOS 7 在 Windows 10 的 docker 桌面上运行。我从 docker 内部连接到在 Windows 10 上运行的 Oracle 12c。如果空闲大约 5 分钟后连接断开。我该如何解决这个问题?

标签: oracledockertcpconnectionhost

解决方案


我在 Docker 中运行具有与第三方应用程序的 TCP 连接的 python 应用程序时遇到了同样的问题。该应用程序在 Linux 上的 Python 中运行时保持无限空闲 TCP 连接,但是在 Docker 容器中运行的同一应用程序恰好在 5 分钟时断开了空闲连接。

我已经阅读了关于空闲 TCP 连接如何/为什么会在 Docker 中丢失的相互矛盾的信息(也许有人可以给出明确的答案),但我找到了一个对我有用的修复程序。

该解决方案分为两部分:一是 Docker Compose YML 配置的更改,二是应用程序代码本身的更改。

首先,我在应用程序的 Docker Compose yml 文件中添加了 sysctls 选项:

app:
  image: myImage:latest
  sysctls:
    - net.ipv4.tcp_keepalive_time=200

这会更改映像的默认 Linux 设置(我相信默认为 600)。

其次,我配置了应用程序的 TCP 套接字代码以引用该 TCP Keepalive 值。在我的例子中,使用 Python,它看起来像这样:

socket_obj.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)

这个套接字选项在 C++ 中是类似的。

希望对您和/或其他遇到此问题的人有所帮助。


推荐阅读