隔离
Namespace:在Linux容器中用来实现“隔离”的技术手段,它实际上修改了应用进程看待整个计算机“视图”,即它的“视线”被操作系统做了限制,只能“看到”某些指定的内容。 但对于宿主机来说,这些被“隔离”了的进程跟其他进程并没有太大区别,都由宿主机操作系统统一管理,只不过这些被隔离的进程拥有额外设置过的Namespace参数。而Docker项目在这里扮演的角色,更多的是旁路式的辅助和管理工作。
虚拟机技术的实现,它里面必须运行一个完整的Guest OS 才能执行用户的应用进程,这就不可避免地带来了额外的资源消耗和占用。相比之下,容器化的用户应用,却是宿主机上的普通进程,不会带来虚拟化带来的性能损耗;另外,使用Namespace作为隔离手段的容器并不需要单独的Guest OS, 这使得容器额外的资源占用几乎可以忽略不计。
“敏捷” 和“高性能”是容器相较于虚拟机最大的优势,也是它能够在PaaS这种更细粒度的资源管理平台上大行其道的重要原因。
但这也为容器技术带来了不足之处,基于Linux Namespace的隔离机制相比于虚拟化,最主要的问题就是:隔离得不彻底。
首先,既然容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的还是同一个宿主机的操作系统内核。
其次,在Linux内核中,有很多资源和对象是不能被Namespace化的,最典型的例子就是:时间。
限制
Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等。
Linux Cgroups 的设计还是比较易用的,它就是一个子系统目录加上一组资源限制文件的组合。
Cgroups 对资源的限制能力也有很多不完善的地方,被提及最多的是/proc文件系统的问题。Linux下的/proc目录存储的是记录当前内核运行状态的一系列特殊文件,用户可以通过访问这些文件,查看系统以及当前正在运行的进程的信息,比如CPU使用情况、内存占用率等,这些文件也是top指令查看系统信息的主要数据来源。
如果在容器里执行top指令,它显示的信息是宿主机的CPU和内存数据,而不是当前容器的数据。造成这个问题的原因就是,/proc文件系统并不知道用户通过Cgroups给这个容器做了什么样的资源限制,即:/proc文件系统不了解Cgroups限制的存在。
在生产环境中,这个问题必须进行修正。