是否有一个服务(linux)在收到传入的 TCP 请求时启动该服务(如果尚不存在),然后将其转发给应用程序?例如,对于 docker 容器,只有当您想要使用它时才会启动。容器在晚上由 cron 停止。
工作流程:
- TCP 客户端 -> TCP 服务器(网关)
- 网关检查服务可用
- 如果可用则转发至
- 如果不可用则
- 停放 TCP 连接
- 启动服务
- 如果已启动则转发连接至
答案1
从技术上来说,是的。
1986 年,4.3BSD Unix 操作系统拥有inetd服务,其工作只是监听 TCP 连接并在活动时生成真正的服务。inetd 不需要转发实际流量——服务本身将继承真正的 TCP 套接字,并能够直接读取/写入网络数据。但是,服务做过需要专门编写以期望已经提供套接字,而不是自行设置所有内容。
许多 BSD 仍然有inetd(尽管它基本没用过),而且大多数 Linux 发行版都有xinetd可用。此外,每个使用 systemd 的 Linux 发行版都可以通过以下方式使用此功能:systemd.socket它被称为“插座激活”。
(它是甚至可以通过这种方式启动整个容器,但容器管理器也需要对此功能的特定支持。例如,systemd-nspawn 可以实现这一点——不幸的是,据我所知,Docker 不支持。但这并没有阻止一些公司在生产中使用按需启动的容器。)
对于不支持套接字传递的程序(或容器),可以使用代理/网关工具来实现按需启动。例如,systemd 也有systemd-套接字代理它将启动真正的系统并向其传递连接(有一个Podman 示例在 Red Hat 博客上,这是Docker 示例);这也可以通过 (x)inetd 使用普通的 netcat 或 socat 作为中继来实现。
答案2
Podman 支持 套接字激活 自 Podman 版本 3.4.0(2021 年 9 月发布)以来的容器。
如果容器内的服务支持套接字激活, 您可以使用systemd和...一起波德曼让 systemd 监听 TCP 套接字。如果客户端连接到 TCP 套接字,systemd 将启动 Podman,以便套接字文件描述符可供 Podman 进程使用。Podman 会将文件描述符传递给容器。
查看Podman 套接字激活教程其中包含如何使用 Podman 运行套接字激活容器的示例。