并行启动`docker start`?

9

我正在单个Docker网络上启动1000个容器,这些容器都来自同一个Docker镜像。

目前部署需要很长时间。我将该过程分成了docker createdocker start两个步骤,而不是使用单块的docker run命令。

有没有办法并行地启动容器?-可以在编程接口(Go、C或其他语言)中工作,也可以使用CLI命令。

相关:Docker引擎是否能够并行启动容器? [3年前提出并已得到解答]


2
你尝试过Swarm或Docker Compose吗? - takacsmark
5
您可以使用Swarm或Compose来启动单个服务(指使用Docker镜像的服务)并扩展容器数量。这两个选项都是可行的,Swarm适用于节点集群,并且还提供负载平衡功能。Compose不会处理端口冲突,而且仅在单台机器上运行。Swarm和Compose都具有部署选项,因此您可以对其进行微调以满足项目需求。 - takacsmark
@Mark 你应该把它变成一个答案。 - jannis
那么我的 docker create 步骤,它设置网络、IP地址和主机名的操作将不再可用? - A T
1
我需要提前知道所有节点的名称和地址。我强烈建议您使用Kubernetes来实现这一点,特别是使用Kops,这样基础设施的创建就非常容易了。它将为您管理网络、DNS、实例集群的创建等等。然后100、1000或10000只是触发扩展的数字。 - Robert
显示剩余4条评论
2个回答

3
使用Swarm或K8s部署容器只是在使用启动命令部署大量容器的基础上增加了一层抽象,它们不会加速该过程(只会使其更易于管理),因此我不确定为什么有这么多人会快速推荐这种解决方案。更多的抽象层并不能加速解决方案的实现。它们所允许的是水平扩展,因此如果您可以将这些容器分布在更多的Docker主机上,编排解决方案可以使其更易于管理,并为您提供一些自动恢复功能以应对任何故障。
run命令是create/start的包装器。所有这些docker命令都是dockerd REST API的小包装器。您可以直接访问该API,但是时间可能会花费在设置命名空间上,包括网络的IPAM和iptables规则。我不知道是否有任何并行API可以加快启动大量容器的速度。加快此过程的一个选项是删除某些命名空间隔离,或查看用于创建命名空间的驱动程序的其他选项。完全切换到主机网络将跳过容器桥接网络和iptables规则,将容器放置在与主机相同的网络命名空间中。
或者,对于网络设置,您可以使用“none”网络配置容器,以避免任何连接到桥接网络和iptables规则,尽管您仍将拥有回环地址。您可以选择在启动容器后将运行的容器连接到网络,因此如果没有发布端口,则可能是将启动命令与网络设置分离的选项,具体取决于您的用例。
除此之外,如果您想要更快的速度,您可能需要更好或更多的硬件,也许需要一个带有性能增强功能的新内核,或者您可能需要删除某些抽象层。如果您愿意自己处理一些网络和其他部分,您可以直接连接到docker使用的containerd后端。只需注意,在这样做时,您将失去docker提供的一些功能。

0

在单个VM(或裸机)中使用1000个容器并不像是可扩展的解决方案。

我建议使用容器编排系统,如Kubernetes、Docker Swarm、Nomad(按照我的个人偏好顺序),并配置多节点、高可用性。Docker Swarm比其流行的对手Kubernetes(K8s)更容易上手。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接