c# - 容器停止时关闭 Docker 端口
问题描述
需要一些帮助。这是情况。
在 Docker 容器内,有一个服务正在运行,可通过 TCP 端口访问。
还有另一个用 .NET 编写的应用程序,它不包含在容器中,通过开放端口与容器化服务通信。
.NET 应用程序使用 TcpClient 类通过套接字连接和写入字节;在写入之前检查 TcpClient.Connected 以确保它是正确的。一切都很好。
为了测试弹性,我停止了包含服务的容器。例外的是 TcpClient.Connected 将变为 false 或在写入时引发 SocketException;或者至少会发生一些事情,因为容器化服务不再可用。
这不会发生。TcpClient 保持连接状态,不会引发异常。
对 netset -nabo 的一些调查显示 TCP 端口保持打开状态,并且应用程序和端口之间的连接保持不变。
理论上,Docker 保持端口打开,并保持与应用程序的连接,即使容器和容器内的服务器已经停止。
有谁知道这是否正确?
目标是模拟端口上的故障以查看 TcpClient 将如何响应。那么,有人知道保持 Docker 运行和关闭端口的好方法吗?
感谢您的阅读,希望对您有所帮助。
解决方案
停止容器不会释放端口。任何向该开放端口发送数据的应用程序仍将继续发送数据,并且不会引发套接字异常。
为什么?据推测,Docker(在 Windows 上)有一个 Linux 虚拟机的代理,它将端口上的流量路由到容器中运行的相关应用程序。容器可能会停止,但代理会保持端口打开。
如果要关闭端口,需要删除容器。
如果容器有配置或 SSL 证书等,这可能不是一个解决方案。在这种情况下,创建一个 Dockerfile 并复制配置。这样可以删除容器并引发套接字异常。
快乐编码。
推荐阅读
- arrays - Kotlin 中具有“n”元素的数组不起作用
- python - 格式化由字典制作的 csv 行
- c++ - 当我使用快速排序对双向链表进行排序时,用户消失了
- c++ - 我什么时候需要使用/拥有一个makefile?
- android - Android,对于 JNI,是否应该在 InputMethodService 中调用 System.loadLibrary?
- php - bash 将输出重定向到文件 - 无法存储临时文本
- spring - Spring Boot 应用程序在 AutoConfigurationImportFilter 上失败,无法构建但未指定类
- laravel - isLocal() 在 Laravel 中实际上做了什么?
- r - 节点标签在 ggraph 和 ggsave 中被截断
- reactjs - 任务“:app:bundleDevReleaseJsAndAssets”执行失败