gpt4 book ai didi

tomcat7 - Docker tomcat7容器无法连接到主机activemq

转载 作者:行者123 更新时间:2023-12-02 18:33:37 26 4
gpt4 key购买 nike

诚然,我对使用 Docker 进行环境隔离相对较新,但我遇到了一个尚未解决的问题,我正在寻找一些关于如何进行的建议。抱歉,如果这很简单。

我有一个用这个 Dockerfile 构建的图像:

FROM java:7-jre
MAINTAINER me <email redacted>

ENV CATALINA_HOME="/usr/local/tomcat"
ENV PATH=$CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"

#Add tomcat tarball with configs
#need to figure out if war files should be auto-deploy or manual-deploy via manager
ADD ./ $CATALINA_HOME

WORKDIR $CATALINA_HOME
RUN tar -xmvf tomcat.tar.gz --strip-components=1 \
&& rm bin/*.bat \
&& rm tomcat.tar.gz*

EXPOSE 8080
#quite possibly unnecessary to expose 61616
EXPOSE 61616

CMD catalina.sh run

因为我的主机是 Mac OSX,所以我使用的是 boot2docker 包。端口转发是一个真正的 PITA,但现在我只是在运行容器 (-p 8080:8080) 时将主机 8080 绑定(bind)到容器 8080。我在 boot2docker 网络设置中转发了 8080。

该图像可以很好地运行容器,并且我可以在该容器运行时手动将 .war 文件上传和部署到该容器。

在我的本地机器上,我正在运行 ActiveMQ。最终我会把它放在一个容器里,但我需要先克服这个障碍。 ActiveMQ 使用默认端口 61616 监听运行,如下 netstat 输出所示:
14:14 $ netstat -a | grep 6161
tcp46 0 0 *.61616 *.* LISTEN

我遇到的问题是我的tomcat容器中部署的war文件无法与61616上的物理主机通信。这是容器上catalina.out日志中的实际错误(我添加了一些换行符以使其更容易读书):
Could not refresh JMS Connection for destination 'request' - retrying in 5000 ms. 
Cause: Error while attempting to add new Connection to the pool; nested exception is javax.jms.JMSException:
Could not connect to broker URL: tcp://localhost:61616.
Reason: java.net.ConnectException: Connection refused

诚然,我认为这是因为 war 文件配置为使用 localhost:61616 连接到 AMQ —— 容器内的 localhost “工作”返回到主机感觉不合适。我不确定我应该将其设置为什么变量值,或者这是否是实际问题。我认为如果它是一个动态分配的黑魔法IP地址,那么在war文件中继续重新配置会相对痛苦。

推论:如果我想将此 tomcat 容器与 AMQ 连接起来,是否需要在此配置之外进行其他考虑?

提前感谢您的关注。 ~P

最佳答案

首先,您不需要在容器上使用 EXPOSE 61616。 (这将允许容器监听端口 61616,这不是您想要的。)

不过,您需要的是从 docker 容器中访问 docker 的 localhost(您的 boot2docker 虚拟机)。到目前为止,我发现的最佳方法来自 this answer , 是在你的 docker 容器中运行:

export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print $2}')

从当前 docker 容器中可以看到,这将为您提供 boot2docker 虚拟机的 IP 地址。我将由您来决定如何配置您的 JMS 客户端以连接到该 IP 地址,但我想到的一个想法是:
echo $DOCKER_HOST_IP my-jms-hostname >> /etc/hosts

然后您可以硬编码您的 JMS 配置以点击 my-jms-hostname:61616

我建议您将上述两个命令放入一个启动脚本中,用于在容器中启动您的应用程序服务器。

接下来,您需要找到一种方法将 boot2docker 虚拟机上的该端口通过隧道连接到本地主机操作系统。例如,在您的本地主机操作系统上,运行
boot2docker ssh -R61616:localhost:61616

这将监听远程(boot2docker VM)端口 61616 并将其转发到您的本地主机操作系统的 localhost:61616,ActiveMQ 希望在此处愉快地监听来自应用程序服务器的 JMS 客户端的传入连接。

关于tomcat7 - Docker tomcat7容器无法连接到主机activemq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28119069/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com