3

我使用Docker 为 AWS 设置和先决条件提供的云形成模板来设置 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 连接。

我无法弄清楚我是否遗漏了什么。有人可以帮忙吗?

4

1 回答 1

3

正如将服务部署到 swarm中所述,如果您继续阅读,您会发现以下内容:

直接在 SWARM 节点
上发布服务端口 如果您需要根据应用程序状态做出路由决策,或者您需要完全控制将请求路由到服务任务的过程,那么使用路由网格可能不是您的应用程序的正确选择。要直接在运行服务的节点上发布服务的端口,请在 --publish 标志中使用 mode=host 选项。

注意:如果您使用 mode=host 直接在 swarm 节点上发布服务的端口并设置已发布=,这会产生一个隐含的限制,即您只能在给定的 swarm 节点上为该服务运行一个任务。此外,如果您使用 mode=host 并且没有在 docker service create 上使用 --mode=global 标志,则很难知道哪些节点正在运行该服务以便将工作路由到它们。

为服务发布端口的工作方式与常规容器不同。问题是;运行service create --publish后,图像不会暴露端口,因此 swarm 路由层无法访问 REST 服务。要解决这个使用模式=主机。

所以我使用下面的命令来创建一个服务:
docker service create --name tuesday --publish mode=host,target=8085,published=8087 akamatibco/docker_swarm_demo:part1

最终消除了异常。

还要确保配置负载均衡器的防火墙设置,以允许通过所需协议进行通信,以便访问部署在容器内的应用程序。
就我而言,它是 HTTP 协议,在负载均衡器上启用端口 8087 即可达到目的。

于 2017-10-10T13:53:20.250 回答