【问题标题】:Scaling Services using Docker Container使用 Docker 容器扩展服务
【发布时间】:2018-03-19 07:55:56
【问题描述】:

我在 docker 中运行一个 java 服务,它基本上是一个套接字服务器。我能够使用 docker 容器运行它,并且能够在主机上发布和公开端口,并且能够使用客户端进行连接。到目前为止一切正常。

这个 java 服务是单线程的,需要这样。因此,为了能够同时处理多个请求,我需要能够扩展它——通过动态生成多个 docker 容器以在不同的端口上运行

我正在考虑编写一个“监听器”,它将接收来自客户端的请求,在随机端口上生成一个带有 java 服务的 docker 容器,将 ip 和端口共享给客户端,从那时起,客户端将直接连接基于 docker 的 java 服务。所以基本上编写一个代理来使用 docker SDK 来处理这个问题。这种方法听起来正确吗?还有其他更好的方法吗?

谢谢

编辑

我需要的是“按需扩展”——每个客户请求一个新实例。不像为负载平衡或高可用性进行缩放。所以我需要能够将新生成的 docker 容器的 IP 和端口共享给客户端,然后客户端可以直接与容器连接。

编辑#2

我设置了 Kubernetes 并在其上部署了一个虚拟的 java 套接字服务。我有两个节点都具有公共 IP。我确认我能够以两种方式连接到服务器套接字 (1) 通过在所需主机端口上连接服务的负载均衡器 (2)通过在容器获取的随机端口上连接两个节点的公网ip并映射到所需的主机端口

这意味着如果我在容器启动时编写一个脚本来将容器(节点)ip 和它获得的随机端口发布到一些外部实体,如 MongoDB 或类似的东西,我的经纪人可以分享那个与客户端程序开始直接通信。

这听起来可行吗?

【问题讨论】:

  • 我认为没有其他方法可以做到这一点。您需要某种代理,它会在有人请求时生成一个新容器。
  • 谢谢 Michael .. 这就是我最初的想法,但我想排除像下面建议的 @yamenk 那样使用像 kubernetes 或 swarm(具有一些配置)这样的成熟解决方案的可能性。

标签: docker kubernetes docker-swarm swarm


【解决方案1】:

您只是在重新发明轮子。已经有可用的工具来实现您想要的。

Docker 原生有Docker swarm。它是 Docker 容器的原生容器编排框架。 Docker swarm 中的容器实例默认是负载均衡的。

您只需指定容器所需的副本数量,传入的请求将在 swarm 中的所有实例之间进行负载平衡。

客户端不应该知道容器的 IP 是什么。客户端只知道主机 IP/DNS 和容器正在侦听的端口。然后,客户端对该主机的请求将以循环方式进行负载平衡。

【讨论】:

  • 感谢您的回复@yamenk。我已经阅读了有关 SWARM 的信息,但我不确定它是否可以满足这些要求 - 1)与每个客户端保持一对一的会话(因为这些是有状态的交互超过几分钟) 2)打开并保持持久的 TCP 套接字连接在客户端和容器之间 3)我们需要超越一台主机,因为在任何时间点都可能有数百个活动会话
  • 和 4) 容器数量是动态的 - 如果现有容量“达到”,它应该自动启动新容器,例如如果所有容器都“正在使用”
  • @AbhayChaware 对于4,我建议你考虑kubernetes。它具有自动缩放功能。 kubernetes.io/docs/tasks/run-application/… 同样,我不建议您构建任何自定义的东西。 Kubernetes 和 docker swarm 都是非常成熟的项目,拥有庞大的开发者社区。如果您的最终目标是可扩展性,那么这两个项目都将可扩展性作为核心功能。
  • 当然。我很乐意重用 Kubernetes 和 Swarm 等成熟产品。根据您使用 Kubernetes 的经验,它是否也有助于解决我的要求 #1、#2 和 #3?
  • 我不相信他完全理解你的问题 Abhay。你应该改写你的问题,因为你本身不想scale,而是运行on-demand。
猜你喜欢
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
相关资源
最近更新 更多