在Docker主机上运行容器的最大数量是多less?
基本上,标题说明了一切:单个Docker主机上同时运行的容器数量是否有限制?
有许多系统限制可以运行(并且变通),但是有很大的灰色区域取决于
- 你如何configuration你的docker集装箱。
- 你在容器中运行什么。
- 什么内核,分发和docker版本你在。
下图是基于Tiny Core Linux 7的boot2docker 1.11.1 vm镜像。 内核是4.4.8
docker
Docker创build或使用一些资源来运行一个容器,而不是在容器内部运行。
- 将虚拟以太网适配器连接到
docker0
网桥(每个网桥最多1023个) - 装载一个AUFS和
shm
文件系统(1048576最大每个fstypes) - 在图像上方创build一个AUFS图层(最多127层)
- 叉一个额外的
docker-containerd-shim
pipe理过程(在avg和sysctl kernel.pid_max
上,每个容器sysctl kernel.pid_max
) - Docker API /守护进程内部数据来pipe理容器。 (每个容器〜400k)
- 创build内核
cgroup
和名称空间 - 打开文件描述符(启动时每个正在运行的容器大约15 + 1个
ulimit -n
和sysctl fs.file-max
)
Docker选项
- 端口映射
-p
会在主机上为每个端口号运行一个额外的进程(平均每个端口约4.5MB,平均1.12,每个端口约300k> 1.12以及sysctl kernel.pid_max
) -
--net=none
和--net=host
将消除networking开销。
集装箱服务
总的限制通常取决于你在容器内运行的内容,而不是docker工人的开销(除非你正在做一些深奥的事情,比如testing你可以运行多less个容器:)
如果你在虚拟机(node,ruby,python,java)中运行应用程序,内存使用可能会成为你的主要问题。
跨越1000个进程的IO将导致大量的IO争用。
1000个进程试图同时运行会导致大量的上下文切换(请参阅上面的vm应用程序进行垃圾回收)
如果您从1000个容器创buildnetworking连接,则主机networking层将获得锻炼。
调整一个linux主机运行1000个进程没有什么不同,只是需要额外的Docker开销。
例
1023运行nc -l -p 80 -e echo host
Docker busybox映像使用了大约1GB的内核内存和3.5GB的系统内存。
1023 plain nc -l -p 80 -e echo host
运行的nc -l -p 80 -e echo host
进程使用大约75MB的内核内存和125MB的系统内存
连续启动1023个集装箱需要8分钟左右的时间。
连续杀死1023个集装箱约需6分钟
实际的限制是系统允许的PID数量,可以在/proc/sys/kernel/pid_max
。 单个容器的开销非常低。 根据系统资源,理论上可以在单个主机上运行数千个容器。
从邮件列表中的一篇文章中,大约有1000个容器开始遇到Linuxnetworking问题。
原因是:
这是内核,特别是net / bridge / br_private.h BR_PORT_BITS由于生成树的要求而不能被扩展。