如何连接到docker容器内的JMS

时间:2018-04-17 07:46:15

标签: docker java-ee jms activemq wildfly-10

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

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

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

  • 将容器IP作为第二个地址添加到Hosts Loopback接口。这在理论上应该有效,但它没有,也感觉像是一个蹩脚的解决方案。
  • 使JMS连接工厂使用主机IP作为套接字绑定。这在理论上也可以,但是野生动物需要实际绑定到给定的IP并且由于无法执行而失败了
  • 将容器的网络驱动程序设置为主机模式,但撰写抱怨只能有一个主机网络。不知道究竟是什么意思,但我不喜欢失去网络分离的想法,所以我没有深入研究
  • 让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"/>

它使用它自己的连接器

 <http-connector name="external-http-connector" socket-binding="external-http" endpoint="http-acceptor"/>

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

<outbound-socket-binding name="external-http">
      <remote-destination host="localhost" port="8080"/>
 </outbound-socket-binding>

这样,如果我使用ExternalConnectionFactory,它会广告可从docker外部访问的IP。显然,我的示例中的localhost只允许从主机连接但只有很少的脚本魔法我应该能够在容器创建时用docker主机IP替换它。

0 个答案:

没有答案