操作系统容器提供的隔离如何不同于内核在许多进程之间提供的隔离?
每个进程已经与在同一内核上运行的任何其他进程隔离。这种隔离与容器提供的隔离有何不同?
答案 0 :(得分:7)
是吗?每个进程已经与在同一内核上运行的任何其他进程隔离。
kill -9
如何运作?如果我有足够的权限,我可以伸手去触摸我想要的任何过程。
像Docker,rkt和LXC这样的容器技术特别利用两个Linux内核功能来实现“容器化”。
第一个是namespaces。从维基百科条目的开头简介:
命名空间是Linux内核的一个功能,它隔离和 虚拟化一组进程的系统资源。示例 可虚拟化的资源包括进程ID,主机名,用户 ID,网络访问,进程间通信和文件系统。 命名空间是Linux上容器的一个基本方面。
因此,我可以使用命名空间来限制进程可以看到的内容或进程可以与之通信的内容,在内核级别。我可以通过以下方式配置进程间通信和文件系统可见性:我的kill -9
命令无法看到位于不同命名空间中的进程,因此不能毫不犹豫地杀死它们。
第二个是control groups,它允许资源限制和隔离。 Cgroup让我们告诉一个过程“你只能拥有512MB的内存和10%的主机CPU使用率”。如果我有一些丑陋的命令能够使用99%的CPU,那么主机上的其他进程将不会被隔离,不必偶尔共享1%的CPU。有了Cgroups,我可以改变它。我可以告诉我丑陋的命令“在任何给定的时间你只能得到25%的CPU”而这就是它所能拥有的一切。
这里要记住的是,这些是 Linux内核功能,而不是一些用螺栓固定的系统管理器工具或其他软件。 Docker / rkt / LXC是围绕内核的这两个核心功能的平台和工具,它们只是利用已经存在的基本级别,使其更加可用。
答案 1 :(得分:1)
如果通过“操作系统容器”表示像Dockers这样的东西,那么我的回答就是这样。
在Dockers上,您可以限制在同一台计算机上设置的每个容器的内存和CPU使用率。 这是一个解释如何以及各种可能性的链接:
https://docs.docker.com/engine/admin/resource_constraints/
在处理过程中,您可以使用Job Objects执行类似操作,但需要在您的app中编码。
https://msdn.microsoft.com/en-us/library/ms684161(VS.85).aspx
希望我能理解这个问题。答案 2 :(得分:0)
两种机制使之成为可能。
使用LINUX命名空间隔离过程
默认情况下,每个Linux系统最初都有一个单独的名称空间。所有系统资源 例如文件系统,进程ID,用户ID,网络接口等属于 单个名称空间。但是您可以创建其他名称空间并组织资源 跨越他们。运行进程时,可以在这些名称空间之一中运行它。的 进程将仅看到相同名称空间内的资源。好吧,多 存在多种名称空间,因此一个进程不属于一个名称空间,而是属于一个名称空间 每种名称空间。
存在以下几种名称空间:
挂载(mnt)
进程ID(pid)
网络(网络)
进程间通信(ipc)
UTS
用户ID(用户)
每种命名空间类型都用于隔离特定的资源组。例如, UTS名称空间确定进程正在运行的主机名和域名 在该名称空间中看到。通过将两个不同的UTS名称空间分配给一对 进程,则可以使他们看到不同的本地主机名。换句话说, 两个进程,就好像它们在两台不同的计算机上运行一样(在 至少就主机名而言)。
同样,进程所属的网络名称空间决定了进程内部运行的应用程序所看到的网络接口。每个网络接口仅属于一个名称空间,但可以从一个名称空间移动到 另一个。每个容器都使用自己的网络名称空间,因此每个容器都可以看到自己的网络接口集。
这应该使您基本了解如何使用名称空间将容器中运行的应用程序彼此隔离。
限制可用于过程的资源
容器隔离的另一半用于限制系统数量 容器可以消耗的资源。这是通过cgroups实现的,cgroups是一种Linux内核功能,可限制一个进程(或一组进程)的资源使用。一个过程 不能使用超过配置的CPU,内存,网络带宽等等的数量。这样,进程就无法占用为其他进程保留的资源, 这类似于每个进程在单独的计算机上运行时的情况。