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