我使用Docker for AWS setup & prerequisites提供的云形成模板来设置docker swarm。
我使用Tibco BusinessWorks Container Edition创建了一个REST服务,并通过创建一个docker服务将其部署到swarm中。
docker service create --name aka-swarm-demo --publish 8087:8085 akamatibco/docker_swarm_demo:part1
服务成功启动,但CloudWatch日志显示以下异常:
我尝试将Dockerfile中的JVM环境变量传递为:
ENV JAVA_OPTS= "-Dbw.rest.docApi.port=7778"
但它没有帮助。
有趣的事实是最后日志说:
com.tibco.thor.frwk.Application - TIBCO-THOR-FRWK-300006: Started BW Application [SFDemo:1.0]
所以我尝试使用CURL访问应用程序 -
curl -X GET --header 'Accept: application/json' 'URL of AWS load balancer : port which I exposed while creating the service/resource URI'
但我收到以下消息:
当我执行docker run时,REST服务正常工作 我检查了管理器和负载均衡器的安全组。负载均衡器对所有流量都是入站开放,对于管理器我打开了HTTP连接。
我无法弄清楚我是否错过了什么。有人可以帮忙吗?
答案 0 :(得分:2)
如Deploy services to swarm中所述,如果您继续阅读,您会发现以下内容:
直接在SWARM NODE上发布服务端口
如果您需要根据应用程序状态做出路由决策,或者您需要完全控制将请求路由到服务任务的流程,则使用路由网格可能不是您的应用程序的正确选择。要直接在运行它的节点上发布服务端口,请使用mode = host选项到--publish标志。
注意:如果使用mode = host直接在swarm节点上发布服务的端口,并且还设置了published =,则会创建一个隐式限制,即您只能在给定的swarm节点上为该服务运行一个任务。此外,如果您使用mode = host并且未在docker service create上使用--mode = global标志,则很难知道哪些节点正在运行该服务以便将工作路由到它们。
发布服务端口的工作方式与常规容器不同。问题是;运行 service create --publish 后,映像不会显示端口,因此swarm路由层无法访问REST服务。要解决此问题,请使用mode = host。
所以我使用下面的命令来创建服务:
docker service create --name tuesday --publish mode=host,target=8085,published=8087 akamatibco/docker_swarm_demo:part1
最终删除了例外。
还要确保配置负载均衡器的防火墙设置,以便允许通过所需协议进行通信,以便访问部署在容器内的应用程序。
对于我的情况,它是HTTP协议,在负载均衡器上启用端口8087,用于此目的。