为什么Docker完全使用用户空间进程?
Nigel Brown在docker-proxy上写了一篇详细的文章,解释了如何以及为什么。
的
docker-proxy,然后,是一个“捕获所有”用于允许容器端口转发到主机多克尔方法。但是,通常认为这docker-proxy是对上述问题的不佳解决方案,并且当暴露大量容器端口时,它将消耗大量内存。先前曾尝试删除对的依赖docker-proxy,但这与RHEL
6.x和CentOS 6.x中老化的内核的限制相抵触,Docker项目感到必须支持这些限制。因此,在docker-proxy当前版本1.5之前的所有Docker版本中,这些
仍然是Docker经验的主要组成部分。在我撰写本文时,即将发布1.6版,并且已经采取了一些措施来删除对docker-proxy,我将在另一篇文章中介绍。
Docker现在包括一个守护程序运行时选项,以使用禁用用户态代理
--userland-proxy=false。这是在v1.7中引入的。
禁用userland代理时,似乎存在一些边缘案例错误。还有IPV6问题
GitHub上存在一个开放的问题,默认情况下禁用userland代理(Docker不再支持RHEL6)。
Docker为什么要为每个端口启动一个进程?
除了以这种方式实现之外,似乎没有其他原因。一个进程应该能够处理容器的所有端口映射
为什么每个进程需要4-6MB的内存?
该
代理实现和包装看起来干净和内置转到功能使用所以这可能只是转到最初的垃圾收集范围,允许它增长到5MB〜。
编辑 :内存使用已在Docker
1.12中得到了改进。每个端口仍然有一个进程,但是每个进程现在仅使用约750k的私有内存空间。



