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