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

我承认,使用Docker进行环境隔离是相对较新的,但是我遇到了一个我尚未解决的问题,我正在寻求一些关于如何继续的build议。 道歉,如果这是污垢简单。

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

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,但现在我只是绑定主机8080到容器8080当我运行容器(-p 8080:8080) ,我有8080在boot2dockernetworking设置转发。

这个映像运行一个容器就好了,我可以在运行时手动上传和部署.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 

无可否认,这是因为战争文件被configuration为使用localhost:61616连接到AMQ – 感觉不适合容器内的本地主机“工作”回到主机。 我不确定我应该设置什么variables值,或者甚至是实际的问题。 我认为如果这是一个dynamic分配的黑魔法IP地址,那么在战争文件内部重新configuration会是相当痛苦的。

推论:如果我想把这个tomcat容器与AMQ链接起来,还有其他的需要考虑的事情吗?

预先感谢您的关注。 〜p

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

你需要做的是从docker容器中访问docker的localhost(你的boot2docker虚拟机)。 到目前为止,我发现这样做的最好方法是在Docker容器中运行:

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

这将给你的boot2docker虚拟机的IP地址,从目前的docker容器中看到。 我将留给你弄清楚如何configuration你的JMS客户端来连接到这个IP地址,但想到的一个想法是这样的:

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

然后你可以硬编码你的JMSconfiguration来打我my-jms-hostname:61616

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

接下来,您将需要find一种方法将boot2docker虚拟机上的该端口连接到本地主机操作系统。 例如,在您的本地主机操作系统上运行

 boot2docker ssh -R61616:localhost:61616 

这将监听远程(boot2docker虚拟机的)端口61616并将其转发到本地主机操作系统的本地主机:61616,这是ActiveMQ希望从应用程序服务器的JMS客户端快速监听传入连接的地方。