我有一个现有的 NodeJS 服务器应用程序:
- 部署在 RHEL7 VM 中
- 客户端通过 URL 向 REST API 发出 HTTPS POST 请求,例如,https://example.url.xxx:3000/api/endpoint
- 应用内中间件代码使用 TLS 和 LDAP 解密并验证请求
- 作为处理请求的一部分,应用程序从网络其他地方的数据库虚拟机检索数据(即不是
localhost
) - 数据库 IP、端口、凭证等在应用内传递到底层框架的数据库连接器
我们目前正在迁移应用程序的代码以适应最新版本的底层框架(这是一个彻底的改造):
- 该应用程序还将升级到 NodeJS 18,并同时通过
node:18-slim
基础映像进行 Dockerised。 - 面向客户端的 API 必须保持不变,即https://example.url.xxx:3000/api/endpoint
- RHEL7 VM 将用作容器的主机。它最终将升级到 RHEL8,但可能不会在容器部署到生产环境之前升级。
- 数据库连接需要使用 SSL 加密。此操作将在应用内通过将包含 SSL 配置的 DSN 字符串传递给数据库连接器来完成。
如何将传入/传出流量路由到容器?我目前能想到两种方法,如下所示:
方法 1:直接在虚拟机的网络接口上公开容器,并为其提供主机虚拟机的原始 IP 配置。主机虚拟机将设置为不同的配置。客户端的 HTTP 请求将解析为与之前相同的 IP 地址,但现在改为发送到容器。
我个人认为这种方法是最干净的,因为原始应用程序中的配置设置可以直接传输并在升级后的 Dockerised 应用程序中重用。
方法 2:仅将容器暴露给localhost
。客户端请求仍发送到映射到的 VM,例如localhost:3000
。同样,来自容器的数据库请求由主机 VM 路由到外部数据库 VM。
我没有使用 Linux VM 的工作经验,因此我不确定如何实施这两种方法:
- 对于方法 1,如何将容器暴露给外部网络?
- 对于方法 2,如何配置主机以路由/映射传入和传出流量?虽然虚拟机内往返于本地主机的流量可能未加密,但客户端-虚拟机连接必须保持使用 HTTPS/TLS 和 LDAP 的保护,并且 DB-VM 连接必须使用 SSL 保护,因此在这种方法中可能需要额外的设置,除非容器内的应用内实现仍然适用。