基本上,标题说明了一切:在单个Docker主机上同时运行的容器数量是否有任何限制?
答案 0 :(得分:32)
您可以遇到许多系统限制(并且可以解决)但是有大量的灰色区域取决于
以下数据来自boot2docker 1.11.1 vm图片,该图片基于Tiny Core Linux 7。内核是4.4.8
Docker创建或使用许多资源来运行容器,而不是在容器内运行。
docker0
网桥(每个网桥最多1023个)shm
文件系统(每个fs类型最多1048576次安装)docker-containerd-shim
管理流程(平均每个容器约3MB,sysctl kernel.pid_max
)cgroup
并命名空格ulimit -n
和sysctl fs.file-max
)-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运行nc -l -p 80 -e echo host
的Docker busybox映像占用了大约1GB的内核内存和3.5GB的系统内存。
在主机上运行的1023个普通nc -l -p 80 -e echo host
进程使用大约75MB的内核内存和125MB的系统内存
连续开始1023个容器需要~8分钟。
连续杀死1023个容器需要约6分钟
答案 1 :(得分:13)
从邮件列表上的帖子中,大约有1000个容器,您开始遇到Linux网络问题。
原因是:
这是内核,特别是net / bridge / br_private.h。由于生成树的要求,无法扩展BR_PORT_BITS。
答案 2 :(得分:0)
使用 Docker-compose,我能够在单个主机(具有 190GB 内存)上运行超过 6k 个容器。容器镜像小于 10MB。但是由于桥接限制,我将容器分批分成多个服务,每个服务有 1k 个容器和单独的子网。
docker-compose -f docker-compose.yml up --scale servicename=1000 -d
但是在达到 6k 后,即使内存在 60GB 左右仍然可用,它也会停止扩展并突然增加内存。应该有 docker 团队发布的基准数据来提供帮助,但不幸的是它不可用。另一方面,Kubernetes 发布了关于每个节点推荐的 Pod 数量的基准统计数据。