Node.js 具有Docker和Oracle CQN的动态端口

Node.js 具有Docker和Oracle CQN的动态端口,node.js,docker,oracle11g,socket.io,Node.js,Docker,Oracle11g,Socket.io,我有一个停靠节点应用程序,可以在另一台机器上的Oracle 11g数据库中创建CQN订阅。它给Oracle一个回调并侦听端口3033。。。一切都很好 我在数据库上看到我的订阅: SELECT REGID, REGFLAGS, CALLBACK FROM USER_CHANGE_NOTIFICATION_REGS; 注册订阅后,将为其分配一个随机可用的端口,在本例中为18837。不幸的是,我的Docker容器没有监听18837,因此Oracle无法访问我的容器。没问题,我将手动指定要使用的端口

我有一个停靠节点应用程序,可以在另一台机器上的Oracle 11g数据库中创建CQN订阅。它给Oracle一个回调并侦听端口3033。。。一切都很好

我在数据库上看到我的订阅:

SELECT REGID, REGFLAGS, CALLBACK FROM USER_CHANGE_NOTIFICATION_REGS;

注册订阅后,将为其分配一个随机可用的端口,在本例中为18837。不幸的是,我的Docker容器没有监听18837,因此Oracle无法访问我的容器。没问题,我将手动指定要使用的端口,并告诉Docker从端口12345开始

  await conn.subscribe('mysub', {
    callback: myCallback,
    sql:      "SELECT * FROM kpi_measurement", // the table to watch
    timeout: 0
    port: 12345
  });
不幸的是。这遇到了“ORA-24911:无法在指定端口启动侦听器线程”的问题。我甚至尝试指定我知道以前使用过的端口,如18837。任何我用炸弹的港口。此外,我不确定是否要在数据库端启动硬编码端口,因为我不能保证它们在生产中可用

我想一个解决方案是将我的Docker容器暴露于一系列端口,但我已经看到这件事选择了广泛的端口


另一个解决方案是将容器分为两部分:1)CQN订阅注册件和2)运行SELECT以获取动态端口的助手,然后使用该动态端口启动docker回调代码。考虑到这在Docker之外可以很好地工作,这真是令人沮丧。

它在Docker之外工作,因为您对主机的端口(“范围广泛”)比容器映像更为开放

如果您愿意让您的主机显示端口的范围,那么允许在该主机上运行的容器接受相同的范围没有什么区别


对容器实现这一点的一种方法是
--net=host
,它将主机的网络直接呈现给容器的主机。您不需要发布——端口,然后容器就可以使用Oracle服务定义的端口。

它在Docker之外工作,因为与容器映像相比,您对主机的端口(“范围更广”)更为开放。如果您愿意让您的主机显示端口的范围,那么允许在该主机上运行的容器接受相同的范围没有什么区别。对容器实现这一点的一种方法是
--net=host
,它将主机的网络直接呈现给容器的主机。您不需要
--publish
端口,容器就可以使用Oracle服务定义的端口。添加--net=host似乎不起作用。我想我应该指定这些都是在docker之外的本地机器上工作的。它在带有docker的测试服务器(CentOS)上不工作。Hmmm:-)也许我在您的配置中遗漏了一些东西。它应该有用!我有一个容器(一个httpd),它在启动时为自己分配一个随机端口。我获取该端口,因为容器是
--net=host
,所以我可以卷曲它配置为使用的任何端口。您的容器将使用
--net=host
运行,同样,无论您的Node.JS进程配置为使用哪个端口,都应该可以从容器外部(由主机)和远程计算机(只要主机可以访问)访问。要测试,我运行了
iptables-I INPUT-j ACCEPT来打开所有端口,我的应用程序现在正在使用
--net=host
工作。我想我不明白为什么我要这么做来打开Oracle CQN端口,我想Docker Expose 3033会把它放在iptables中?我有一些Unix防火墙需要学习。我还需要找到Oracle CQN使用的端口,并公开这些端口。请随便把你的帖子作为答案,我会竖起大拇指的。感谢您的记录,我最后这样做了:
sudo firewall cmd--zone=public--add port=30000-49999/tcp--permanent
sudo firewall cmd--zone=public--add port=3033/tcp--permanent
sudo firewall cmd--reload
docker run--name-d--network host-p3033:3033-e ENV=test30000:49999
这是一个很大的错误。Docker为iptables中的每个端口添加了几行。它最终撞上了docker,我不得不施展魔法让它重新上线。