【问题标题】:`docker start` in parallel?`docker start` 并行?
【发布时间】:2019-02-27 14:20:43
【问题描述】:

我在一个 Docker 网络上运行 1000 个容器,所有容器都来自同一个 Docker 映像。

目前部署需要很长时间。我将流程分为docker createdocker start,而不是单一的docker run

有什么方法可以并行旋转容器? - 乐于使用编程接口(Go、C 等)或使用 CLI 命令。

相关:Can Docker Engine start containers in parallel[3年前问及回答]

【问题讨论】:

  • 你试过 Swarm 或 Docker Compose 吗?
  • 那些不只是为了运行相互关联的容器吗? - AFAIK 他们不会同时docker run/docker start 他们。
  • 您可以使用 Swarm 或 Compose 来启动单个服务(即使用 Docker 映像的服务)并扩展容器的数量。这两个选项都是可行的,Swarm 可以在节点集群上工作,也可以为您提供负载平衡。 Compose 不会处理端口冲突,它只能在单台机器上工作。 Swarm 和 Compose 都具有部署选项,因此您可以根据自己的项目对其进行微调。
  • @Mark 你应该把它作为一个答案。
  • “我需要提前知道所有节点名称和地址”,我强烈建议您使用 Kubernetes 来实现这一点。特别是使用 Kops,因此基础设施的创建非常容易。将为您管理网络、dns、创建实例集群等。然后 100、1000 或 10000 将只是触发扩展的数字。

标签: docker docker-engine containerd


【解决方案1】:

使用 Swarm 或 K8s 部署容器只是在使用启动命令部署大量容器之上增加了一层抽象,它们不会加快进程(只会使其更易于管理),所以我不知道为什么这么多人很快就为您的问题推荐这个。更多的抽象层不会加速解决方案。它们所允许的是水平扩展,因此如果您可以将这些容器分布在更多 docker 主机上,编排解决方案可以让管理变得更容易,并让您从任何故障中自动恢复。

运行命令是对创建/启动的包装。所有这些 docker 命令都是围绕 dockerd 的 REST API 的小型包装器。您可以直接访问该 API,但时间可能会花在设置命名空间上,包括 IPAM 和网络的 iptables 规则。我不知道有任何并行 API 会加速许多容器的启动。加快此过程的一种选择是删除一些命名空间隔离,或者查看用于创建命名空间的驱动程序的其他选项。切换到主机网络完全跳过了容器桥接网络和 iptables 规则,将您的容器与主机放在同一个网络命名空间中。

或者使用网络,您可以使用“无”网络配置容器,以避免与桥接网络和 iptables 规则的任何连接,尽管您仍然有一个环回地址。您确实可以选择在启动后将正在运行的容器连接到网络,因此,如果您没有发布的端口,则可以选择将启动命令从网络设置中分离出来,具体取决于您的用例。

除此之外,如果您想要更快,您可能需要更好或更多的硬件,可能需要具有性能增强的更新内核,或者您可能需要删除一些抽象层。如果您愿意自己处理一些网络和其他部分,您可以直接连接到 docker 使用的容器后端。请注意,这样做会丢失 docker 提供的一些功能。

【讨论】:

    【解决方案2】:

    单个 VM(或 Baremetal 机器)中的 1000 个容器听起来不像是可扩展的解决方案。

    我建议使用具有多节点、高可用性配置的容器编排系统,例如 Kubernetes、Docker Swarm、Nomad(按我的个人喜好排序)。 Docker swarm 比流行的 Kubernetes (K8s) 更容易启动和运行

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多