我正在单个Docker网络上分解1000个容器,全部来自同一Docker映像。
当前部署需要很长时间。我已将流程分为docker create
和docker start
,而不是整体的docker run
。
有什么办法可以并行旋转容器? -很高兴在编程界面(Go,C等)中工作,或使用CLI命令。
相关:Can Docker Engine start containers in parallel [在3年前提出并回答]
答案 0 :(得分:0)
单个VM(或Baremetal机器)中的1000个容器听起来并不像可扩展的解决方案。
我建议使用多节点高可用性配置的容器编排系统,例如Kubernetes,Docker Swarm,Nomad(按照我的个人喜好顺序)。与流行的同类产品Kubernetes(K8s)相比,Docker swarm的安装和运行要简单得多。
答案 1 :(得分:0)
使用Swarm或K8s部署容器只是在使用start命令部署大量容器的基础上增加的抽象层,它们不会加快处理过程(仅使其更易于管理),所以我不知道为什么这么多人会很快推荐您的问题。更多的抽象层不能加快解决方案的速度。它们所允许的是水平扩展,因此,如果您可以将这些容器分布在更多的docker主机上,那么编排解决方案可以使其更易于管理,并可以自动从任何故障中恢复。
run命令是围绕create / start的包装。所有这些docker命令都是围绕dockerd的REST API的小型包装。您可以直接使用该API,但是可能会花费时间来设置名称空间,包括用于网络的IPAM和iptables规则。我不知道任何并行API会加速许多容器的启动。加快此速度的一种方法是删除某些名称空间隔离,或查看用于创建名称空间的驱动程序的其他选项。完全切换到主机网络将跳过容器桥网络和iptables规则,从而将容器与主机置于同一网络名称空间中。
或者通过网络,可以为容器配置“无”网络,以免与网桥网络和iptables规则建立任何连接,尽管您仍然会有一个环回地址。您确实可以选择在启动后将运行中的容器连接到网络,因此,如果您尚未发布端口,则可以根据使用情况从网络设置中拆分启动命令。 >
除此之外,如果您想要更快,则可能需要更好或更多的硬件,也许需要具有性能增强的较新内核,或者可能需要删除一些抽象层。如果您愿意自己处理一些网络事务和其他事务,则可以直接连接到docker使用的容器化后端。请注意,这样做会丢失docker提供的某些功能。