我们有一个具有多个容器的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公开和访问。
以下是我尝试的一些解决方案:
理想情况下,我喜欢优雅的金色子弹"适用于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替换它。