无法访问部署在 AWS 中 docker 群中的 REST 服务

Unable to access REST service deployed in docker swarm in AWS

我使用Docker for AWS setup & prerequisites提供的云形成模板搭建了一个docker群。

我使用 Tibco BusinessWorks Container Edition 创建了一个 REST 服务,并通过创建 docker 服务将其部署到集群中。
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 运行.
时,REST 服务工作正常 我检查了管理器和负载均衡器的安全组。负载均衡器已对所有流量开放入站,并且我为管理器打开了 HTTP 连接。

我不知道是否遗漏了什么。有人可以帮忙吗?

Deploy services to swarm中所述,如果您继续阅读,您会发现以下内容:

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

注意:如果您使用 mode=host 直接在 swarm 节点上发布服务的端口并设置 published= 这会产生一个隐式限制,即您只能 运行 一个任务给定群节点上的服务。此外,如果您使用 mode=host 并且在 docker 服务创建时不使用 --mode=global 标志,将很难知道哪些节点正在 运行ning 服务以便将工作交给他们。

服务的发布端口与常规容器的工作方式不同。问题是;该图像在 运行ning 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。