首页 > 解决方案 > 容器停止时关闭 Docker 端口

问题描述

需要一些帮助。这是情况。

在 Docker 容器内,有一个服务正在运行,可通过 TCP 端口访问。

还有另一个用 .NET 编写的应用程序,它不包含在容器中,通过开放端口与容器化服务通信。

.NET 应用程序使用 TcpClient 类通过套接字连接和写入字节;在写入之前检查 TcpClient.Connected 以确保它是正确的。一切都很好。

为了测试弹性,我停止了包含服务的容器。例外的是 TcpClient.Connected 将变为 false 或在写入时引发 SocketException;或者至少会发生一些事情,因为容器化服务不再可用。

这不会发生。TcpClient 保持连接状态,不会引发异常。

对 netset -nabo 的一些调查显示 TCP 端口保持打开状态,并且应用程序和端口之间的连接保持不变。

理论上,Docker 保持端口打开,并保持与应用程序的连接,即使容器和容器内的服务器已经停止。

有谁知道这是否正确?

目标是模拟端口上的故障以查看 TcpClient 将如何响应。那么,有人知道保持 Docker 运行和关闭端口的好方法吗?

感谢您的阅读,希望对您有所帮助。

标签: c#dockernetworkingtcpclient

解决方案


停止容器不会释放端口。任何向该开放端口发送数据的应用程序仍将继续发送数据,并且不会引发套接字异常。

为什么?据推测,Docker(在 Windows 上)有一个 Linux 虚拟机的代理,它将端口上的流量路由到容器中运行的相关应用程序。容器可能会停止,但代理会保持端口打开。

如果要关闭端口,需要删除容器。

如果容器有配置或 SSL 证书等,这可能不是一个解决方案。在这种情况下,创建一个 Dockerfile 并复制配置。这样可以删除容器并引发套接字异常。

快乐编码。


推荐阅读