首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker tomcat7容器无法连接到主机activemq

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

Stack Overflow用户
提问于 2015-01-23 21:33:33
回答 1查看 2.6K关注 0票数 2

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

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

代码语言:javascript
复制
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,所以我使用的是boot2docker包。端口转发是一个真正的皮塔,但是现在我只是在运行容器(-p 8080:8080)时将主机8080绑定到容器8080,并且在boot2docker网络设置中转发了8080。

这个映像很好地运行了一个容器,并且我能够在这个容器运行时手动地上传和部署.war文件。

在我的本地机器上,我正在运行ActiveMQ。最后,我会把这个放在一个容器里,但我需要先通过这个障碍。ActiveMQ正在运行,默认端口61616正在侦听,如此netstat输出所示:

代码语言:javascript
复制
14:14 $ netstat -a | grep 6161
tcp46      0      0  *.61616                *.*                    LISTEN

我遇到的问题是,在我的tomcat容器中部署的war文件无法在61616上与物理主机对话。下面是容器上的catalina.out日志的实际错误(我添加了一些换行符以便于阅读):

代码语言:javascript
复制
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 --容器中的本地主机无法“工作”到主机。我不确定应该将它设置为哪个变量值,或者这是否是实际问题。我认为如果它是一个动态分配的黑魔法IP地址,那么继续在war文件中重新配置会比较痛苦。

推论:如果我想将这个tomcat容器与一个AMQ连接起来,我还需要做一些其他的考虑吗?

提前感谢您的关注。~P

EN

回答 1

Stack Overflow用户

发布于 2015-02-02 22:37:58

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

不过,您需要的是从码头容器中访问码头的本地主机(您的boot2docker VM)。到目前为止,我从this answer找到的最好的方法是在您的码头容器中运行:

代码语言:javascript
复制
export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print $2}')

这将为您提供boot2docker VM的IP地址,从当前的停靠容器中可以看到这一点。我将由您来决定如何配置JMS客户端来连接到该IP地址,但想到的一个想法是:

代码语言:javascript
复制
echo $DOCKER_HOST_IP my-jms-hostname >> /etc/hosts

然后,您可以硬编码您的JMS配置,以访问my-jms-hostname:61616。

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

接下来,您需要找到一种将boot2docker VM上的端口隧道到本地主机操作系统的方法。例如,在本地主机操作系统上运行

代码语言:javascript
复制
boot2docker ssh -R61616:localhost:61616

这将在远程(boot2docker VM)端口61616上侦听,并将其转发到本地主机OS的本地主机:61616,希望ActiveMQ能够在那里愉快地侦听来自应用服务器的JMS的传入连接。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28119069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档