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

时间:2015-01-23 21:33:33

标签: tomcat7 docker boot2docker

对于使用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绑定到容器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

1 个答案:

答案 0 :(得分:1)

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

您需要的是从docker容器中访问docker的localhost(您的boot2docker VM)。到目前为止,我发现从this answer开始执行此操作的最佳方法是在docker容器内运行:

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

这将为您提供boot2docker VM的IP地址,如当前docker容器中所示。我将让您了解如何配置JMS客户端以连接到该IP地址,但我想到的一个想法是:

echo $DOCKER_HOST_IP my-jms-hostname >> /etc/hosts

然后你可以硬编码你的JMS配置来命中my-jms-hostname:61616

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

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

boot2docker ssh -R61616:localhost:61616

这将侦听远程(boot2docker VM&#39; s)端口61616,并将其转发到本地主机操作系统的localhost:61616,这是ActiveMQ希望从您的应用程序中快速收听传入连接的地方服务器的JMS客户端。