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客户端快速监听传入连接的地方。
- Docker Kitematic连接ETIMEDOUT错误
- 为什么要将数据容器从数据库容器中分离出来比把数据容量从磁盘中分离出来要好呢?
- 使用托pipe在docker上的私有registry
- vagrant:boot2docker:无法在本地查找图像“drupal”
- 为什么我得到'无法解决从registry2docker registry.giantswarm.io“'错误?
- Docker Couchbase:无法使用入口点脚本中的curl连接到端口8091
- docker工具库名称组件必须匹配
- 我的boot2docker安装似乎没有工作。 我究竟做错了什么?
- 我怎样才能提高我的Boot2Docker虚拟机的性能