Docker主机上是否有最大数量的容器运行?

Gol*_*den 24 docker

基本上,标题说明了一切:在单个Docker主机上同时运行的容器数量是否有任何限制?

Mat*_*att 35

您可以遇到许多系统限制(并且可以解决),但是依赖于大量的灰色区域

  1. 如何配置docker容器.
  2. 您在容器中运行的是什么.
  3. 你所使用的内核,发行版和docker版本.

下图来自boot2docker 1.11.1 vm映像,该映像基于Tiny Core Linux 7.内核是4.4.8

搬运工人

Docker创建或使用许多资源来运行容器,而不是在容器内运行的容器.

  • 将虚拟以太网适配器连接到docker0网桥(每个网桥最多1023个)
  • 安装AUFS和shm文件系统(每个fs类型最多1048576次安装)
  • 在图像上创建一个AUFS图层(最多127层)
  • 福克斯1个额外的docker-containerd-shim管理流程(平均每个容器大约3MB sysctl kernel.pid_max)
  • Docker API /守护进程内部数据来管理容器.(每箱约400k)
  • 创建内核cgroup和名称空间
  • 打开文件描述符(〜15 + 1在每启动时运行的容器.ulimit -nsysctl fs.file-max)

Docker选项

  • 端口映射-p将在主机上为每个端口号运行额外的进程(avg pre 1.12上每个端口约4.5MB,每个端口约300k> 1.12 sysctl kernel.pid_max)
  • --net=none并且--net=host会删除网络开销.

集装箱服务

总体限制通常取决于你在容器内运行的内容而不是码头工人的开销(除非你做了一些深奥的事情,比如测试你可以运行多少个容器:)

如果您在虚拟机(node,ruby,python,java)中运行应用程序,内存使用可能会成为您的主要问题.

1000个进程中的IO会导致很多IO争用.

尝试同时运行的1000个进程会导致大量的上下文切换(请参阅上面的vm apps进行垃圾回收)

如果您从1000个容器创建网络连接,则主机网络层将进行锻炼.

调整linux主机以运行1000个进程并没有太大的不同,只需要包含一些额外的Docker开销.

1023运行的Docker busybox映像nc -l -p 80 -e echo host占用大约1GB的内核内存和3.5GB的系统内存.

nc -l -p 80 -e echo host在主机上运行的1023个普通进程使用大约75MB的内核内存和125MB的系统内存

连续开始1023个容器需要约8分钟.

连续杀死1023个集装箱需要约6分钟

  • 我的观点是,当使用 Docker 形式的容器时,需要考虑很多开销。系统_不会_命中`pid_max`容器。由于 docker 的额外进程,该数字首先除以 2。如果将其调低,您可能会接近“max_pid/2”。如果采用标准 32768 值,则最多有 16384 个容器进程。到该阶段,Docker 将打开至少 134 225 920 个文件描述符(仅内核内存就约 134GB 块)。对于纯容器,“pid_max”可能会发挥作用。Docker 的实际限制要低得多。 (2认同)

小智 14

从邮件列表上的帖子,大约1000个容器,您开始遇到Linux网络问题.

原因是:

这是内核,特别是net/bridge/br_private.h.由于生成树要求,无法扩展BR_PORT_BITS.

  • 您可以通过提供"邮件列表上的帖子"的链接来改进这个答案,并解释说有一个`docker0`桥,每个容器都附有`veth`接口,以及`BR_PORT_BITS`限制意味着`veth`接口的最大数量是10位可以表示的最大整数. (3认同)
  • @errordeveloper可能在这里:https://groups.google.com/d/msg/docker-user/k5hqpNg8gwQ/-00mvrB2nIkJ (2认同)

小智 5

借助 Docker-compose,我能够在单个主机(具有 190GB 内存)上运行超过 6k 个容器。容器镜像小于 10MB。但由于网桥限制,我将容器分批划分为多个服务,每个服务有 1k 个容器和独立的子网。

docker-compose -f docker-compose.yml up --scale servicename=1000 -d
Run Code Online (Sandbox Code Playgroud)

但在达到 6k 后,尽管内存仍然可用在 60GB 左右,但它会停止缩放并突然增加内存。docker 团队应该发布基准数据来提供帮助,但不幸的是它不可用。另一方面,Kubernetes 发布了关于每个节点推荐的 Pod 数量的基准统计数据。