oracle - 5 分钟后,用于托管 TCP 连接的 Docker 断开
问题描述
我有一个 CentOS 7 在 Windows 10 的 docker 桌面上运行。我从 docker 内部连接到在 Windows 10 上运行的 Oracle 12c。如果空闲大约 5 分钟后连接断开。我该如何解决这个问题?
解决方案
我在 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++ 中是类似的。
希望对您和/或其他遇到此问题的人有所帮助。
推荐阅读
- c++ - 如何将类型的字符串表示形式转换为 C++ 中的类型本身?
- python - 将时间序列转换为事件窗口会话
- java - 为每个测试分配不同的名称以存储用户输入并访问它
- asp.net - Hangfire 仪表板的更复杂的身份验证
- r - 要替换的项目数不是替换长度的倍数
- c - C中的“创建结构的新空实例”是什么意思?
- eclipse - 依赖需要不存在的子依赖maven
- python - 将 scipy.ndimage.gaussian_filter 用于 prmsl 数据的 2d 数组并绘制而不会在 0 子午线附近中断
- java - Spring Boot 中 List 的 getter 和 setter
- vb.net - 为什么打印水晶报告时我的代码很慢,也没有在所需的打印机上打印?