【问题标题】:Unable to access REST service deployed in docker swarm in AWS无法访问部署在 AWS 的 docker swarm 中的 REST 服务
【发布时间】:2017-10-04 11:59:54
【问题描述】:

我使用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 连接。

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

【问题讨论】:

    标签: amazon-web-services swagger-ui docker-swarm tibco-business-works


    【解决方案1】:

    正如Deploy services to swarm 中提到的,如果您继续阅读,您会发现以下内容:

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

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

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

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

    最终消除了异常。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 2017-06-04
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      相关资源
      最近更新 更多