小编twy*_*ski的帖子

如何连接到 docker 容器内的 JMS

我们有一个带有多个容器的 docker 设置(Windows 10、本机 docker、compose V3),其中一个运行带有 JMS 子系统(ActiveMQ)的 Wildfly 10。在 docker NAT 内部一切正常(各种服务通过 in-vm 或 http 连接器使用 JMS),但我们还需要从外部 docker 连接到 JMS。我们通过wildfly 公开的JMSConnectionFactory 上的远程JNDI 查找实现JMS 连接。问题是连接工厂公布了无法从外部访问的 docker 容器的内部 IP 地址。

我们有正确的端口(实际上只需要一个 http 端口)可以通过 localhost 公开和访问。

以下是我尝试过的一些解决方案:

  • 将容器 IP 作为第二个地址添加到 Hosts Loopback 接口。这在理论上应该有效,但它没有,而且感觉像是一个蹩脚的解决方案。
  • 使 JMS 连接工厂使用主机 IP 作为套接字绑定。这在理论上也可以,但是 wildfly 需要实际绑定到给定的 IP 并且它失败了,因为它无法做到
  • 将容器的网络驱动程序设置为主机模式,但 compose 抱怨只能有一个主机网络。不确定它到底是什么意思,但我不喜欢失去网络分离的想法,所以我没有深入研究
  • 让 JMS 工厂通告主机名,而不是使用 DNS 或 /etc/hosts。无论我将什么放入standalone.xml 作为套接字绑定,它都会被转换为IP。

理想情况下,我想要一个适用于 Windows 和 Linux 的优雅的“金子弹”解决方案,但我知道这可能无法实现。

更新:我找到了一个解决方案(有点hacky)但我认为除非有人提出更好的建议,否则应该这样做。

我在wildfly中创建了额外的JMSConnectionFactory(在standalone.xml中配置):

  <connection-factory name="ExternalConnectionFactory" entries="java:jboss/exported/jms/ExternalConnectionFactory" connectors="external-http-connector"/>
Run Code Online (Sandbox Code Playgroud)

它使用自己的连接器

 <http-connector name="external-http-connector" socket-binding="external-http" endpoint="http-acceptor"/>
Run Code Online (Sandbox Code Playgroud)

我使用出站套接字绑定,这部分有点麻烦,因为它允许我指定任何网络地址。

<outbound-socket-binding name="external-http">
      <remote-destination …
Run Code Online (Sandbox Code Playgroud)

activemq-classic jms docker wildfly-10 jakarta-ee

6
推荐指数
0
解决办法
1774
查看次数

标签 统计

activemq-classic ×1

docker ×1

jakarta-ee ×1

jms ×1

wildfly-10 ×1