Docker容器的主要应用之一是负载平衡。例如,对于Web应用程序,我们有许多容器执行完全相同的操作,而不仅仅是让一个实例处理所有请求,而是将请求分配给所有这些实例。
但是它可以用于提供相同的服务,但使用不同的“参数”吗?
例如,假设我想创建一个存储来自不同交换平台(Bitfinex,Bittrex等)的加密货币数据的平台。
其中许多平台都在处理Web套接字。因此,为了在每个平台上创建一个套接字,我会在“代码层”上做一些事情,例如(与语言无关):
foreach (platform in platforms)
client = createClient(platform)
socket = client.createSocket()
socket.GetData()
现在,当然,该循环将停留在第一次迭代中,因为websocket正在等待(尽管无论如何我都可以使用异步)。为了避免这种情况,我可以使用多重处理,例如:
foreach (platform in platforms)
client = createClient(platform)
socket = client.createSocket()
process = new ProcessWhichGetData(socket)
process.Launch()
有没有办法在“ Docker层”上做到这一点,我的意思是使用Docker来使不同的容器处理不同的平台?我将有一个用于Bittrex的Docker容器,一个用于Bitfinex的Docker容器,等等。
我知道这意味着不同的容器之间将相互通信(谁来照顾Bitfinex?谁来照顾Bittrex?),或者容器协调器(Docker Swarm / Kubernete)将自己处理这种“分区”
这是我们可以做的,最重要的是,我们想要吗?
答案 0 :(得分:1)
假设您将其重构为一个长期运行的程序,该程序一次仅处理一个平台,并通过命令行选项或环境变量控制它是哪个平台。与其在代码中“启动所有平台”循环,不如编写一个
这样的shell脚本。#!/bin/sh
for platform in $(cat platforms.txt); do
./run_platform $platform &
done
此设置很容易移植到Docker中。
您不应计划动态启动Docker容器的进程。这很难设置并且具有重大的安全隐患(我的意思是“您的容器启动器中的错误可能很容易将您的主机root”)。
如果单个处理任务都可以完全独立地运行(也许它们使用共享数据库存储数据),那么您基本上就可以完成。您可以使用诸如Docker Compose YAML文件之类的东西替换该shell脚本,该文件列出了所有容器。如果要在多个主机上运行此程序,则可以使用Ansible,Docker Swarm或Kubernetes之类的工具来分散容器(具有不同级别的基础架构复杂性)。
答案 1 :(得分:1)
Docker容器化只是在常规用户土地流程周围添加了各种隔离层。尽管可以肯定地在构建多进程系统中利用它,但无论这些工作是多余的还是互补的,它都可以在构建多进程系统中加以利用,尽管每个工作执行某些任务。
如果您可以设计解决方案,以便为每个“平台”启动一个进程(例如,通过实例将特定实例作为命令行参数传递给特定平台),那么实际上,这可以在Docker中完成。
但是我应该指出,不清楚为什么要在不同的容器中运行每个进程。出于安全考虑,隔离是否相关?对于资源核算?为了将每个进程分派到不同的主机以便获得更多处理能力?另外,除了必须首先确定哪个进程处理哪个平台之外,这些流程之间是否需要协调?如果是这样,他们是否需要访问共享存储或能够相互发送信号?这些问题将帮助您决定如何进行解决方案的Docker化。
在最简单的情况下,假设您想要的是将整个过程与系统的其余部分隔离开,但是不要求将这些过程相互隔离,那么最简单的策略就是有一个包含入口点外壳程序脚本的容器,该脚本将仅在每个平台上启动一个进程。
entrypoint.sh (inside your docker image):
#!/bin/bash
platforms=Bitfinex Bittrex
for platform in ${platforms} ; do
./myprogram "${platform}" &
done
如果每个平台确实需要一个不同的容器,则可以使用类似的脚本,但是这次,它将直接在主机(即容器外部)上运行,并封装每个进程在Docker容器中。
launch.sh (directly on the host):
#!/bin/bash
for platform in ${platforms} ; do
docker -name "program_${platform}" my_program_docker \
/usr/local/bin/myprogram "$platform"
done
或者,您可以使用docker-compose
来定义要启动的docker容器列表,但目前我不会再讨论此选项(只问这是否与您的情况相关)。
如果需要在多个主机之间分配容器,则可以使用相同的循环,但是这次,将使用docker-machine
启动进程。另外,如果使用docker-compose
,则可以使用Swarm分发进程。
答案 2 :(得分:0)
您可以将不同的Docker容器捆绑在一个堆栈中,还可以配置网络,以便docker容器可以与外界保持隔离,但可以相互通信。
此处更多信息Docker Stack